• 计算[1,N]范围内含有7的数字的个数


    计算含有7的数字的个数
    http://topic.csdn.net/u/20081102/11/1C6136BB-AD44-49E1-868B-D848816456F6.html
    思路:
    我们先求出对于[1-N]的所有数字中不含7的数字的总个数cnt,将N-cnt即为所求的含有7的个数
    设 cnt = F(N);
    且N为n位数,且首位数为a,则有
    F(N)  = a*^9^(n-1)   +      F(N - a*10^(n-1))       ; a<digit
            = a*^9^(n-1) -1                                        ; a==digit
            = (a-1)*^9^(n-1) + F(N - a*10^(n-1))        ; a>digit

    View Code
    #include <iostream>
    using namespace std;

    /*
    计算含有7的数字的个数
    http://topic.csdn.net/u/20081102/11/1C6136BB-AD44-49E1-868B-D848816456F6.html
    思路:
    我们先求出对于[1-N]的所有数字中不含7的数字的总个数cnt,将N-cnt即为所求的含有7的个数
    设 cnt = F(N);
    且N为n位数,且首位数为a,则有
    cnt = F(N) = a*^9^(n-1) + F(N - a*10^(n-1)) ; a<digit
    = a*^9^(n-1) -1 ; a==digit
    = (a-1)*^9^(n-1) + F(N - a*10^(n-1)) ; a>digit
    */
    typedef unsigned long long ull;
    ull SumOf1s(ull const N, int digit= 1)
    {
    ull radix= 1;
    ull factor = 1;
    ull n =N;
    while(n>=10)
    {
    radix*=10;
    factor*=9;
    n/=10;
    }
    ull cnt = 0;
    n = N;
    while(radix!=0)
    {
    ull val = n/radix;
    n%=radix;
    if(val==digit)
    {
    cnt += val*factor;
    --cnt;//将0也算进去了
    break;
    }
    if(val>digit)
    --val;
    cnt += val* factor;
    radix/=10;
    factor/=9;
    }
    return N-cnt;
    }

    //以下代码为雪中飞燕的代码
    int SunOf1sOther(int n,int digit =1)
    {
    int nlist[16], nb, s=0, t=n, p=0;
    for (nb=0; t>0; ++nb)
    {
    nlist[nb] = t%10;
    if (nlist[nb] > digit)
    {
    --nlist[nb];
    }
    else if (nlist[nb] == digit)
    {
    --nlist[nb];
    for (; p<nb; ++p)
    {
    nlist[p] = 8;
    }
    }
    t /= 10;
    }
    for (--nb; nb>=0; --nb)
    {
    s = s*9 + nlist[nb];
    }
    return n - s;
    }
    int main()
    {
    for(int i=0;i<100000;++i)
    {
    if(SumOf1s(i,7)!=SunOf1sOther(i,7))
    {
    cout<<i<<" "<<SumOf1s(i,7);
    cout<<" "<<SunOf1sOther(i,7)<<endl;
    }
    }
    }




  • 相关阅读:
    11.10
    11.9
    11.8 总结
    11.7
    11.6
    日报10.6
    日报10.5
    每周总结-3
    日报10.4
    日报10.2
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2220864.html
Copyright © 2020-2023  润新知