演算法實現題 統計數字

2021-10-24 09:18:15 字數 2114 閱讀 4399

一本書的頁碼從自然數 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這些數字在頁碼中出現的次數,以空格分隔。行末無空格。示...