計算機算法設計與分析(作業)

 

渐进记号

 • 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;
}

 

posted @ 2019-10-26 23:13  163467  阅读(140)  评论(0编辑  收藏  举报