1. 程式人生 > >頁碼統計(統計數字)

頁碼統計(統計數字)

牛牛新買了一本演算法書,演算法書一共有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];
	}
}