在王曉東編著的《演算法設計與實驗題解》中看到的這個問題,問題描述如下:
一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,3,.....9。
剛開始寫的時候直接用暴力解法,演算法時間複雜度是o(n^2),在處理數字稍微大一點就很吃力,然後看了看配套的習題解答,數學上說的很經典。
給定乙個n位數,比如說5位數,那麼從00000(5個零)到99999(5個9),由於每一位上的0~9這10個數字出現的頻率是相同的,所以這10個數字出現的次數也相同,書中給出的推到公式是:n*(10^(n-1))。
我看了些部落格,以及加上自己在回宿舍的路上想的一些方法,其實有點麻煩的是最高位的演算法啦。
給乙個數字y,如果它是n位數,那麼它的n-1位一定滿足上述的推導公式。假設這個數y的最高位上的數是x,那麼前n-1位中的0~9這10個數字出現的次數就是上述推導公式*x。不難理解的是:從0到x-1的數字,出現的次數為10^(n-1)。最高位出現的次數就是:y%10^(m-1)+1
這樣的話**實現如下:
#include using namespace std;
long long num[10] = ;
int numlen (int n)
return cnt;
}int firstnum(int len,int n)
int f(int n)
void countn(int n)
for(i=1; i>page;
len = numlen(page);
for(i=0; ifor(i=0; i<10; i++)
cout
}
統計數字問題
在王曉東編著的 演算法設計與實驗題解 中看到的這個問題,問題描述如下 一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,...
統計數字問題
問題描述如下 一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,3,9。演算法設計與分析習題 分析 考察由0,1,2.9...
統計數字問題
問題描述 給定乙個整數n,統計從1到n 數字最高位不允許為0 這麼多個數中0,1,2,3,4,5,6,7,8,9分別出現的次數。問題解決 採用遞迴求解統計每乙個數字0,1,2,9出現的次數累加。源 include stdafx.h include int results 10 void count ...