给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有”1“的个数。
解法一:穷举法,遍历1到N的每一个数,计算其出现1的整数的个数;虽然笨,但是想不出其他方法就这样了;
解法二:分类讨论,分别讨论个位,十位和百位...上1能出现的次数。
假设这个数为abcd,则:
d 为1时,出现1的数据的个数有abc个;
c为1时,出现1的数据的个数有abd个;
b为1时,出现1的数据的个数有acd个;
a为1时,出现1的数据的个数有bcd个;
当然具体还要看当前位置是0或是1,稍微调整。
上代码:
- #include<iostream>
- using namespace std;
- unsigned long Sumls(unsigned long n);
- int main()
- {
- cout<< Sumls(1);
- return 0;
- }
- unsigned long Sumls(unsigned long n)
- {
- unsigned long iCount=0;
- unsigned long iFactor=1;
- unsigned long iLowerNum=0;
- unsigned long iCurrNum=0;
- unsigned 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;
- }