版权声明:本文为博主原创文章,未经博主允许不得转载。 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];
}
}