計算機算法設計與分析(作業)
渐进记号
• O:若∃𝑐 > 0, 𝑛0 > 0: ∀𝑛 ≥ 𝑛0, 0 ≤ 𝑇 𝑛 ≤ 𝑐 ⋅ 𝑓(𝑛),则称𝑇(𝑛) = 𝑂(𝑓 𝑛 )
• Ω:若∃𝑐 > 0, 𝑛0 > 0: ∀𝑛 ≥ 𝑛0, 0 ≤ 𝑐 ⋅ 𝑓(𝑛) ≤ 𝑇 𝑛 ,则称𝑇 𝑛 = Ω(𝑓 𝑛 )
• ϴ:若𝑇 𝑛 = 𝑂(𝑓 𝑛 )且𝑇 𝑛 = Ω(𝑓 𝑛 ),则称𝑇 𝑛 = ϴ(𝑓 𝑛 )
• o:若∀𝑐 > 0, ∃𝑛0> 0: ∀𝑛 ≥ 𝑛0, 0 ≤ 𝑇 𝑛 < 𝑐 ⋅ 𝑓(𝑛),则称𝑇(𝑛) = 𝑜(𝑓 𝑛 )
• ω:若∀𝑐 > 0, ∃𝑛0> 0: ∀𝑛 ≥ 𝑛0, 0 ≤ 𝑐 ⋅ 𝑓 𝑛 < 𝑇 𝑛 ,则称𝑇 𝑛 = ω(𝑓 𝑛 )
統計 1~n 的頁碼中 0~9數字出現次數
1 ~ 1eX 0~9的出現次數都爲 (X-1)*1e(X-2)
#include<bits/stdc++.h> using namespace std; #define ll long long #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++) int main(){ freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int n; while(cin >> n){// 例如 2143 int x = ceil(log10(n+1));// 防止尾數為 1 死循環 int cnt[10] = {}; _for(i,0,x){ int r = ceil(log10(n+1));// 如上 int k = n/pow(10, r-1); _for(j,0,10) cnt[j] += k*(r-1)*pow(10, r-2);// 記錄小於 000~999 的 0~9 的出現次數 _for(j,0,k) cnt[j] += (int)pow(10, r-1);// 記錄 整數 0XXX 1XXX 的 0 與 1 的出現次數 cnt[k] += n%(int)pow(10, r-1)+1;// 記錄 2XXX 的 2 出現次數 n %= (int)pow(10, r-1); // 如法炮製 143 43 3 } _for(i,0,x) cnt[0] -= pow(10, i); _for(i,0,10) cout << cnt[i] << endl; } return 0; }