計數問題(/C++)
阿新 • • 發佈:2019-02-06
計數器 (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; }