一本書的頁碼從自然數 1 開始順序編碼直到自然數 n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字 0。例如,第 6 頁用數字 6 表示,而不是 06 或 006 等。數字計數問題要求對給定書的總頁碼 n,計算出書的全部頁碼中分別用到多少次數字 0,1,2,…,9。給定表示書的總頁碼的 10 進製整數 n (1≤n≤10^9) 。程式設計計算書的全部頁碼中分別用到多少次數字 0,1,2,…,9。程式執行結束時,將計算結果輸出到檔案 output.txt 中。輸出檔案共有 10 行,在第 k 行 輸出頁碼中用到數字 k-1 的次數,k=1,2,…10。
這道題很容易想到暴力解法,比如把各個數進行取餘運算再進行數字匹配,或者把所有的數字組成字串再進行遍歷和匹配計數,但這樣的作法只能應付資料較小的情況,題目的資料上限是10^9,所以這些方法都不適宜。
查閱一些資料後了解到這樣乙個公式:
n位數的各個數字出現的次數滿足:n*10^(n-1)。
這裡的「n位數」是指用0補位的,例如三位數是值 000 - 999。
我們可以把乙個n+1位數拆分為乙個首位數(m,m肯定不是0) 和乙個 n位數(k)。這個k定然滿足上述 "n位數" 的情況。
例如:給定頁數1315,我們可以把它拆分為 首位8和乙個3位數。
在有首位數(m)的前提下,上面的公式就發生了乙個小的變化,這個很好理解,假設我們給定資料3556,m=3,共有如下3種有效情況:
1.首位數為1,1連線3位數。
2.首位數為2,2連線3位數。
3.首位數為3,3連線3位數。
那麼上面的公式就變成這樣:乙個n+1位數,在去除首位數(m)的情況下,後面n位數出現0-9的次數均為 m*n*10^(n-1)。
到這裡我們已經完成了第一步,然後再考慮首位數的情況,首位數出現的次數與後面的數有關,這個很好理解。
至此,乙個n+1位數的情況已經分析得差不多了。我們還得考慮一些特殊情況,比如1000,1003這些數,我們對數去首位的方法採用取餘法,這樣會過濾掉中間或者尾部的0,針對這類情況我們直接將其加上就行。
下面根據分析情況得出**:
/*
統計數字問題
*/#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
void
func
(unsigned
long num,
int size, vector<
unsigned
long
>
& count)
//首位從0到first_num計數
count[first_num]
+= after_fst_num +1;
// +1是因為多了個了全零位
for(
int i =
0; i < first_num; i++)if
(after_fst_num ==0)
else
if(size - size_after_fst_num >1)
//加上中間的0,因為每次遞迴都是用的餘數,中級的0會被跳過
func
(after_fst_num, size_after_fst_num, count);}
intmain()
func
(num, size, count)
;//減去前置多填充的0,位數從1開始
for(
int i =
1; i <= size; i++
)//輸出到螢幕
for(
auto x : count)
//輸出到檔案
ofstream outfile;
outfile.
open
("outfile.txt");
for(
auto x : count)
outfile.
close()
;//記錄測試時間
//time_t t2 = clock();
return0;
}
演算法實現題 1 1 統計數字問題
問題描述 一本書的頁碼從自然數 1 開始順序編碼直到自然數 n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字 0。例如,第 6 頁用數字 6 表示,而不是 06 或 006 等。數 字計數問題要求對給定書的總頁碼 n,計算出書的全部頁碼中分別用到多少次數字 0,1,2,9。程式設計任務 ...
A 統計數字
time limit 1 sec memory limit 128 mb submit 51 solved 28 submit status web board 某次科研調查時得到了n個自然數,每個數均不超過1500000000 1.5 109 已知不相同的數不超過10000個,現在需要統計這些自然...
頁碼統計(統計數字)
牛牛新買了一本演算法書,演算法書一共有n頁,頁碼從1到n。牛牛於是想了乙個演算法題目 在這本演算法書頁碼中0 9每個數字分別出現了多少次?輸入描述 輸入包括乙個整數n 1 n 1,000,000,000 輸出描述 輸出包括一行10個整數,即0 9這些數字在頁碼中出現的次數,以空格分隔。行末無空格。示...