<编程之美>给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1的个数

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是《编程之美》上的一个题目,题目如题:

给定一个十进制正整数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位以下的数字,和书上的结果一样,但没严格证明过)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值