这个是《编程之美》上的一个题目,题目如题:
给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1的个数。
书上给出了两个解法,第一个就是笨方法,挨个数呗,最后加一块。
第二个解法,有兴趣的自己看书上的分析吧,这里先把Java实现的代码贴下:
public static long F_Sum1s(long n){
long iCount = 0;
long iFactor = 1;
long iLowerNum = 0;
long iCurrNum = 0;
long iHigherNum = 0;
while(n/iFactor != 0){
iLowerNum = n - (n/iFactor)*iFactor;
iCurrNum = (n/iFactor)%10;
iHigherNum=n/(iFactor*10);
switch(String.valueOf(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;
}
之前我想到一个递推公式,想来和书上的解法本质应该差不多,现把公式和代码贴出来供大家讨论下&#x