页码统计(统计数字)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LightInDarkness/article/details/82814444

牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?

输入描述:

输入包括一个整数n(1 ≤ n ≤ 1,000,000,000)


 

输出描述:

输出包括一行10个整数,即0~9这些数字在页码中出现的次数,以空格分隔。行末无空格。

示例1

输入

999

输出

189 300 300 300 300 300 300 300 300 300

分析:

       本题最简单的方法大概就是暴力了吧,但是我觉得样例中应该会卡这个点,所以就没有选择暴力的方法。个人思路是从低位到高位开始统计0-9在每个数位上出现的次数,找规律即可。但是0比较特殊,因为页码是从第1页开始编的,没有0。所以需要做些特殊处理。还有就是为了以防万一,都用了long long类型,防止溢出。

#include<iostream>

using namespace std;

int main(){
        //如果N = 123456, times:当前处理位数级别(个位、十位...)
	//若times = 1000(千位), be = 12, ne = 456, r = 3
	long long N, be, ne = 0, temp, r, times = 1;
	long long num[10] = {0};
	cin >> N;
	temp = N;
	//统计次数
	while(temp > 0){
		be = temp / 10;
		r = temp % 10;
		//核心代码, 找规律, 统计0-9分别在个位、十位、百位...出现次数 
		if(r != 0) num[0] += be * times;
		for(int i = 1; i < r; i++)
			num[i] += (be + 1) * times;
		if(r == 0) num[r] += (be - 1) * times + ne + 1;
		else num[r] += be * times + ne + 1;
		for(int i = r + 1; i < 10; i++)
			num[i] += be * times;
		//========================================================
		times *= 10;
		ne = N % times;
		temp /= 10;
	}
	//输出
	for(int i = 0; i < 10; i++){
		if(i == 0) cout << num[i];
		else cout << ' ' << num[i];
	}
}

猜你喜欢

转载自blog.csdn.net/LightInDarkness/article/details/82814444
今日推荐