計算頁碼各個數(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