EXAMPLE
input: 35
output: 14 [list of 2’s: 2, 12, 20, 21, 22, 23, 24, 25, 26, 27,28, 29, 32]
从0枚举到n,统计2的个数,显然太麻烦了,而且不是数学方法。。
既然是要统计从0到n中,一共出现了多少2,那就可以考虑:个位一共多少2,十位一共多少2,百位一共多少2... 最后加起来就可以
比如35 [其实就是035]: (03+1)*1 + (0+1)*10=14;
个位的2 十位的2
括号里为什么要+1呢? 因为这位上本身的数>=2;如果该位上<2,就+0 。
再比如135 [0135]: (013+1)*1 + (01+1)*10 + (0+0)*100 = 34;
个位的2 十位的2 百位的2( 1<2,所以+0)
所以可以得到算法(计算第i位包含的2个数[自友至左,最右面是第0位]):
( N / 10^(i+1) + k ) * 10^i; 其中 第i位<2则k=0; 第i位>=2则k=1。
( N / 10^(i+1) + k ) * 10^i; 其中 第i位<2则k=0; 第i位>2则k=1;第i位==2需要特殊处理一下——暂时令k=0,但是最后要加上少算的一部分。
int count2(int n)
{
int i=0,j,k,ans=0,n0=n;
while (n>0)
{
j = n % 10;
n = n / 10;
k = j>2 ? 1 : 0;
ans += (n + k) * pow(10,i);
if (j==2)
{
k=n0%((int)pow(10,i))+1;
//printf("n0=%d,i=%d,pow=%d\n",n0,i,(int)pow(10,i));
ans=ans + k;
}
++i;
}
return ans;
}
但是这里还有个问题,就是
pow函数。当count2(200)的时候,printf输出显示n0=200,i=2,pow=99。但是单独打印pow(10,2)却显示100。。。why?
自己写一个pow10()函数后,替换pow()就可以正常运行了。
代码:http://download.csdn.net/detail/ghoshorn/8039793
书里给的答案,没太看懂-_-||