这个是《编程之美》上的一个题目,题目如题:
给定一个十进制正整数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;
}
之前我想到一个递推公式,想来和书上的解法本质应该差不多,现把公式和代码贴出来供大家讨论下,是否正确(自己简单试了下,12位以下的数字,和书上的结果一样,但没严格证明过)。

本文探讨《编程之美》中的一道问题,即如何计算从1到给定十进制正整数N之间所有整数中1的总数。文中提供了两种解法,一种是直接数数,另一种是通过递推公式。作者分享了自己的递推公式实现,并指出该公式在一定范围内与书中的结果一致。

2004

被折叠的 条评论
为什么被折叠?



