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




相关文章:

  • 2021-12-23
  • 2022-03-08
  • 2021-06-01
  • 2021-09-14
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2021-11-27
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2021-11-02
  • 2021-06-02
  • 2021-09-22
  • 2021-05-08
相关资源
相似解决方案