计算[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;
}
}
}