統計數字問題

2021-08-27 18:37:57 字數 918 閱讀 3376

在王曉東編著的《演算法設計與實驗題解》中看到的這個問題,問題描述如下:

一本書的頁碼從自然數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 ...