1. 程式人生 > >計數問題(/C++)

計數問題(/C++)



計數器 (count)
【問題描述】
    一本書的頁數為N,頁碼從1開始編起,請你求出全部頁碼中,用了多少個0,1,2,…,9。其中—個頁碼不含多餘的0,如N=1234時第5頁不是0005,只是5。
【輸入】
 一個正整數N(N≤109),表示總的頁碼。
【輸出】
 共十行:第k行為數字k-1的個數。
【樣例】
 count.in    count.out
 11     1
      4
      1
      1
      1
      1
      1
      1
      1
      1

這個題目,學過一點奧數的人都會,把0~9每個數字逐位處理就行了,把這個數拆開,分析各個數字在不同位上共出現了多少次。

比如說234這個數,把它拆成200,30,和4。當然這裡只是虛擬拆分。200指的其實是0~199,30是200~229,4是220~234(這裡其實是5個)

接下來就每一位計算就行了,注意在計算後面幾位時要加上前幾位出現次數,還有計算完之後要減掉中間為了方便計算而多加的數目,程式碼如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
	int n,l,m,a[10],b[10],ast[10];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	l=0;
	b[1]=1;
	cin >> n;
	m=n;
	while(m>0)
	{
		l++;
		ast[l]=m%10;
		m/=10;
	}
	for(int i=2;i<=9;i++)
	{
		b[i]=b[i-1]*10;
	}
	m=n;
	for(int i=l;i>=1;i--)
	{
		for(int j=0;j<=9;j++)
		{ 
			a[j]+=b[i-1]*(i-1)*ast[i];
		}
		for(int j=0;j<=ast[i]-1;j++)
		{ 
			a[j]+=b[i];
		}
		a[ast[i]]+=m%b[i]+1;
	}
	for(int i=1;i<=l;i++)
	{ 
		a[0]-=b[i];
	}
	for(int i=0;i<=9;i++) cout << a[i] << endl;
	return 0;
}