给定一个十进制正整数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;
}