在王曉東編著的《演算法設計與實驗題解》中看到的這個問題,問題描述如下:
一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,3,.....9。
這個題目有個最容易想到的n*log10(n)的演算法。這是自己寫的複雜度為o(n*log10(n))的**:
intn;int c[10];//
計數void
calc()
while(j!=0
); }
for(int i=0;i<10;i++)
cout
}int
main()
return0;
}
寫了個指令碼來處理測試資料:
t=`find test -type f`mkdir
answer1
for i in $t; do
echo
$i pos=$-4
echo $
k=$./count < $i > answer1/count$.out
done
formdos answer/* 轉換編碼
diff -ru answer answer1
更優演算法;
考察由0,1,2...9組成的所有n位數。從n個0到n個9共有10^n個n位數。在這10^n個n位數中,0,1,2.....9每個數字使用次數相同,設為f(n)。f(n)滿足如下遞推式:
n=1情況: f(n) =1
n>1情況: f(n) = 10f(n-1)+10^(n-1)
最前面可新增0-9 這十個數字,所以後面所有數字出現次數為 10f(n-1) ,加上最前面這個數字自己出現的次數10^(n-1)
f(2)=10*1+10^1=20
據此,可從高位向低位進行統計,再減去多餘的0的個數即可。
10(10f(n-2)+10^(n-2))+10^(n-1) = 10^2*f(n-2)+2*10^(n-1) = 10^(n-1)*f(1) +(n-1)*10^(n-1) =n*10^(n-1)
bash 固定位置擷取
$:擷取變數varible從位置start開始長度為len的子串。第乙個字元的位置為0。
統計數字問題
在王曉東編著的 演算法設計與實驗題解 中看到的這個問題,問題描述如下 一本書的頁碼從自然數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 ...