編程之美 2.4 1的數目

問題1:寫一個函數f(N),返回1到N之間出現的“1”的個數。

假設N=abcde,分別統計a、b、c、d、e位上出現的1的個數,它們之和就是總的1的個數

a位上1的個數:

若a>1,則爲10000;

若a=1,則爲bcde+1;

a不可能爲0。

b位上1的個數:

若b>1,則爲(a+1)*1000;

若b=1,則爲(a+1)*(cde+1);

若b=0,則爲a*1000

c位上1的個數:

若c>1,則爲(ab+1)*100;

若c=1,則爲(ab+1)*(de+1);

若c=0,則爲ab*100

d位上1的個數:

若d>1,則爲(abc+1)*10;

若d=1,則爲(abc+1)*(e+1);

若d=0,則爲abc*10

e位上1的個數:

若e>1,則爲(abcd+1)*1;

若e=1,則爲(abcd+1)*(0+1);

若e=0,則爲abcd*1

根據上面的規律,寫出以下程序

///統計1~N中含1的個數
#include<iostream>
using namespace std;
int main()
{
    int N; //輸入的N
    int num=0;//記錄1的個數
    cin>>N;
    int high=0;//存儲當前位的高位,如ab
    int low=0;//存儲當前位的低位,如de
    int curr=0;//存儲當前位,如c  
    
    int beishu=1;
    
    while(N)
    {
        
        curr=N%10;
        high=N/10;
        if(curr==0)
        {
            num+=high*beishu;
        }
        else if(curr==1)
        {
            num+=(high+1)*(low+1);
        }
        else
            num+=(high+1)*beishu;
        low+=curr*beishu;    
        beishu*=10;
        N/=10;
    }
    cout<<num<<endl;
    return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章