計算頁碼各個數(shù)字出現(xiàn)的次數(shù)

計算頁碼各個數(shù)字出現(xiàn)的次數(shù)

方法一:笨方法實現(xiàn)

#include<iostream>
using namespace std;
int get_length(int x);
long x;
int i;
 
int main() {
    cin >> x;
    int static count[10];
    for (int i = 0;i <= 9;i++) {
        count[i] = 0;
    }
    for (i = 1;i <= x;i++) {
        if (get_length(i) == 1) {
            count[i]++;
        }
 
        if (get_length(i) == 2) {
            count[i % 10]++;
            count[i / 10]++;
        }
 
        if(get_length(i)==3){
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[i / 100]++;
        }
 
        if (get_length(i)==4) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[i / 1000]++;
        }
 
        if (get_length(i)==5) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[i / 10000]++;
        }
 
        if (get_length(i) == 6) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[(i % 100000) / 10000]++;
            count[i / 100000]++;
        }
 
        if (get_length(i) == 7) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[(i % 100000) / 10000]++;
            count[(i % 1000000) / 100000]++;
            count[i / 1000000]++;
        }
 
        if (get_length(i)==8) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[(i % 100000) / 10000]++;
            count[(i % 1000000) / 100000]++;
            count[(i % 10000000) / 1000000]++;
            count[i / 10000000]++;
        }
        
        if (get_length(i) == 9) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[(i % 100000) / 10000]++;
            count[(i % 1000000) / 100000]++;
            count[(i % 10000000) / 1000000]++;
            count[(i % 100000000) / 10000000]++;
            count[i / 100000000]++;
        }
 
        if (get_length(i) == 10) {
            count[i % 10]++;
            count[(i % 100) / 10]++;
            count[(i % 1000) / 100]++;
            count[(i % 10000) / 1000]++;
            count[(i % 100000) / 10000]++;
            count[(i % 1000000) / 100000]++;
            count[(i % 10000000) / 1000000]++;
            count[(i % 100000000) / 10000000]++;
            count[(i % 1000000000) / 100000000]++;
            count[i / 1000000000]++;
        }
    }
    for (int i = 0;i <= 9;i++) {
        cout << count[i] << "   ";
    }
    
}   
 
 
int get_length(int x){
    using namespace std;
    int leng = 0;
    while (x){
        x =x / 10;
        leng++;
    }
    return leng;
}

方法二:通過較好的算法實現(xiàn)

#include<iostream>
using namespace std;
int f(int n);
int s(int n);
int get_length(int x);
int get_nozero_lenth(int x);
int x;
int _x;
 
int main() {
    for (;;) {
        cout << "輸入頁碼(按0結(jié)束):";
        cin >> x;
        if (x == 0||x<0) {
            exit(0);
        }
 
        _x = x;
        int c[10];
        for (int i = 0;i <= 9;i++) {
            c[i] = 0;
        }
        //假設(shè)輸入的數(shù)字為400321
        for (int j = 0;j < get_nozero_lenth(x);j++) {
            //獲取最高的位數(shù)字a
            int a = _x / pow(10, (get_length(_x) - 1));
            //假設(shè)輸入的數(shù)是6位數(shù),那么從000000開始算到輸入的數(shù)字x
            //獲取000000~099999 中,后5位數(shù)中0~9出現(xiàn)的次數(shù) b
            int b = f(get_length(_x) - 1);
            //a為最高位,等于0~3 的個數(shù),a*b 的值就是000000~399999 中,后5位里面0~9 出現(xiàn)的次數(shù),最高位還沒有計算
            for (int i = 0;i <= 9;i++) {
                c[i] = c[i] + a*b;
            }
 
            //獲取輸入_x的長度 , 第一次循環(huán) _x==400321 ,第二次循環(huán)_x==321 第3次循環(huán) _x==21 ,以此類推
            int len = get_length(_x);
            //獲取最高位m
            int m = _x / (pow(10, len - 1));
            //在最高位繼續(xù)獲取 0~(m-1) 出現(xiàn)的次數(shù) , 例如 000000~099999 僅僅在最高位中0出現(xiàn)的次數(shù)就有100000次,100000~199999,以此類推
            for (int i = 0;i < m;i++) {
                c[i] = c[i] + pow(10, len - 1);
            }
 
            //以下3行代碼,獲取除最高位以外剩下的數(shù)字m1,例如輸入是400321,那么m1是321
            int m1 = _x / (pow(10, len - 1));
            m1 = m1*pow(10, len - 1);
            m1 = _x - m1;
 
            //計算輸入x的最高位那個數(shù)出現(xiàn)的次數(shù),當前輸入時400321,只計算4出現(xiàn)的次數(shù)
            c[m] = c[m] + (m1 + 1);
 
 
            int after = (pow(10, len - 1));
            //dv是_x的長度,之后,和得到的新的_x的長度作差,然后減去1,得到0的個數(shù),輸入400321 ,下面的變量NumOfZero將會等于2
            int dv = get_length(_x);
            //獲取除最高位以外,剩余的數(shù)字_x,下一輪循環(huán)用剩余的數(shù)字_x作為輸入,現(xiàn)在,更新后的 _x==321 ,下一輪循環(huán),將使用321作為輸入
            _x = _x % after;
            //把輸入x中的0算進去,例如把400321中的兩個0算進去
            int NumOfZero= (dv - get_length(_x) - 1)*(_x + 1);  //在這里,(2)* 322, 計算400321中兩個0出現(xiàn)的次數(shù)
            c[0] = c[0] + NumOfZero;
        }
 
        //把多余的0減去
        c[0] = c[0] - s(get_length(x));
 
        for (int i = 0;i <= 9;i++) {
            cout << "數(shù)字" << i << "用的次數(shù):" << c[i] << endl << endl;
        }
        
    }
 
}
 
 
//n是位數(shù),表示幾位數(shù)0~9用的次數(shù)
int f(int n) {
    return n*pow(10, (n - 1));
}
 
//n是輸入x的位數(shù),去除多余的0
int s(int n) {
    return ((pow(10, n) - 1) / 9);
}
 
//獲取輸入x的長度
int get_length(int x) {
    int count = 0;
    while (x != 0) {
        x = x / 10;
        count++;
    }
    return count;
 
}
 
//獲取除0以外的數(shù)字的位數(shù),例如400321,調(diào)用此函數(shù)以后,返回值就是4,
int get_nozero_lenth(int x) {
    int count = 0;
    int y = x;
    while (x != 0) {
 
        x = (x / pow(10, get_length(x) - 1));
        x = x*pow(10, get_length(y) - 1);
        x = y - x;
        y = x;
        count++;
    }
    return count;
}

效果:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,632評論 1 32
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 14,118評論 1 92
  • 1)結(jié)構(gòu) 結(jié)構(gòu)就是一系列緊密聯(lián)系的知識。 結(jié)構(gòu)如同思想中的一座城市,城市中有很多建筑物,建筑物之間有道路相連,有些...
    胡惱火閱讀 794評論 1 4
  • 文定居閱讀 318評論 0 0
  • 性是肉體生活,遵循快樂原則。愛情是精神生活,遵循理想原則?;橐鍪巧鐣睿裱F(xiàn)實原則。這是三個完全不同的東西,婚...
    總在清晨與傍晚閱讀 143評論 0 0

友情鏈接更多精彩內(nèi)容