您的位置:首页 > 其它

给定一个正整数N,从1到N所有整数,计算出现1的个数

2014-04-08 16:15 127 查看

给定一个正整数N,从1到N所有整数,计算出现1的个数

最简单方法是计算每个数中1的个数然后相加,但是这么做效率随着数字增大超线性增长。

f(N)为要求值,N为正整数。

改进方法 规律分析:计算f(N)转换到计算N每一位出现1的个数,这种情况最大好处就是避免了重复计算个数问题。

举例子说明:

如果百位为0 ,百位上出现1的个数有其高位决定,12013 百位出现1 情况 100-199 ,1100-1199,2100-2199 ......11100-11199 共1200个 。也就是高位12决定,即为 12*100(百位)。

如果为百位为1 ,百位出现1次数不仅由高位决定也由低位影响。12113 除了像上面那样高位分析外还增加低位 12100-121113 共 低位数字+1个。

数字为2-9 为高位数+1再乘以当前位数。

#include <iostream>
using namespace std;

long SumofOne(long num)
{
	long count=0;
	long factor=1;
	long lownum=0,currentnum=0,highnum=0;
	while (num/factor!=0)
	{
		highnum=num/(factor*10);
		currentnum=(num/factor)%10;
		lownum=num-(num/factor)*factor;
		switch(currentnum){
		case 0:
			count+=highnum*factor;
			break;
		case 1:
			count+=highnum*factor+lownum+1;
			break;
		default:
			count+=(highnum+1)*factor;
			break;
		}
		factor=factor*10;
	}
	return count;
}

int main()
{
	long num=10000;
	cout<<"包含1的数目为:"<<SumofOne(num)<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐