计算前N个数字钟1的个数(编程之美2.4 1的数目)

本文对比了两种不同的计数算法:一种是简单的穷举法,虽然实现思路清晰但效率较低;另一种则是通过数学分析优化后的高效算法。文章通过具体代码实现了这两种算法,并展示了如何计算从1到N的所有整数中数字1出现的次数。

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

#include "point.h"
using namespace std;
int CalcOneHelp(int);
int CalcOne(int);
int power(int ,int);

int CalcOne(int N)//穷举法,比较傻瓜,思路简单,运算速度慢
{
	int sum=0;
	for(int i=1;i<=N;i++)
		sum+=CalcOneHelp(i);
	return sum;
}
int CalcTwo(int N)//新算法,需要进行一些数学分析,运算速度快
{
	int e=0;//这事10的指数
	int sum=0;
	int numlater=0;//当前数字后面的数字,如12345;如果当前数字为2(千位),那么numlater为345
	while(N>0)
	{
		int obj=N%10;//当前该位的数字
		int numpre=N/10;//当前这个数字前面的数字,如712345;如果当前数字为2(千位),那么numpre为71
		if(0==obj)
			sum+=numpre*power(10,e);
		else if(1<obj)
			sum+=(numpre+1)*power(10,e);
		else//为1
			sum+=(numpre*power(10,e))+numlater;
		//计算完毕,还要做3件事情
		numlater+=obj*power(10,e);
		e++;
		N=numpre;	
	}
	return sum;
}
void main()
{
	int N;
	while(true){
		cin>>N;
		int rst1=CalcOne(N);//alg 1
		int rst2=CalcTwo(N);//alg 2
		cout<<rst1<<endl;
		cout<<rst1<<endl;

	}
}
int CalcOneHelp(int T)
{
	int mysum=0;
	while(T>0)
	{
		int rem=T%10;
		if(rem==1)
			mysum++;
		T=T/10;
	}
	return mysum;
}
int power(int b,int e)
{
	int rst=1;
	for(int i=0;i<e;i++)
		rst*=b;
	return rst;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值