编程之美:1的数目

题目:写一个函数f(N),返回1到N之间出现的"1"的个数。

 

     假设N=A*10^i + B*10^(i-1) + C,即A,B和C分别代表第i位的高位数值,当前位数值和低位数值。第i位上1的个数与A,B,C可能都有关。

     当B > 1时,([0-A],1,*)<(A,B,C),一共是(A+1)*10^i个1,高位相关。


     当B = 1时,([0-(A-1),1,*])<(A,B,C),[A,1,[0-C]] <= (A,B,C),一共是A*10^i+C+1个1,高位低位相关。


     当B = 0时,([0-(A-1)],1,*)<(A,B,C),一共是A*10^i个1,高位相关。

程序1:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

int find_num( int N,  int x)
{
     int count =  0;
     int A, B, C, factor;
    factor =  1;
     while(N >= factor)
    {
        A = N / (factor *  10);
        B = N / factor %  10;
        C = N % factor;
        cout <<  "(A,B,C): " <<  "(" << A <<  "," << B <<  "," << C <<  ")" << endl;
         if(B > x)
            count += (A +  1) * factor;
         else  if(B == x)
            count += A * factor + C +  1;
         else
            count += A * factor;
        factor *=  10;

    }
     return count;
}

程序2:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//解法二,通过找规律来实现
long  long sum1s( long  long n)
{
     long  long iCount =  0;
     long  long iFactor =  1;
     long  long iLowerNum =  0;
     long  long iCurrNum =  0;
     long  long iHigherNum =  0;

     while(n / iFactor !=  0)
    {
        iLowerNum = n - (n / iFactor) * iFactor;
        iCurrNum = (n / iFactor) %  10;
        iHigherNum = n / (iFactor *  10);

         switch(iCurrNum)
        {
         case  0:
            iCount += iHigherNum * iFactor;
             break;
         case  1:
            iCount += iHigherNum * iFactor + iLowerNum +  1;
             break;
         default:
            iCount += (iHigherNum +  1) * iFactor;
             break;
        }
        iFactor *=  10;
    }
     return iCount;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值