1.2 从0到n,共包含多少个2?

1.2 Write a method to count the number of 2’s between 0 and n.
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

书里给的答案,没太看懂-_-||


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值