問題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;
}