计算页码各个数字出现的次数
方法一:笨方法实现
#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;
}
方法二:通过较好的算法实现
#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结束):";
cin >> x;
if (x == 0||x<0) {
exit(0);
}
_x = x;
int c[10];
for (int i = 0;i <= 9;i++) {
c[i] = 0;
}
//假设输入的数字为400321
for (int j = 0;j < get_nozero_lenth(x);j++) {
//获取最高的位数字a
int a = _x / pow(10, (get_length(_x) - 1));
//假设输入的数是6位数,那么从000000开始算到输入的数字x
//获取000000~099999 中,后5位数中0~9出现的次数 b
int b = f(get_length(_x) - 1);
//a为最高位,等于0~3 的个数,a*b 的值就是000000~399999 中,后5位里面0~9 出现的次数,最高位还没有计算
for (int i = 0;i <= 9;i++) {
c[i] = c[i] + a*b;
}
//获取输入_x的长度 , 第一次循环 _x==400321 ,第二次循环_x==321 第3次循环 _x==21 ,以此类推
int len = get_length(_x);
//获取最高位m
int m = _x / (pow(10, len - 1));
//在最高位继续获取 0~(m-1) 出现的次数 , 例如 000000~099999 仅仅在最高位中0出现的次数就有100000次,100000~199999,以此类推
for (int i = 0;i < m;i++) {
c[i] = c[i] + pow(10, len - 1);
}
//以下3行代码,获取除最高位以外剩下的数字m1,例如输入是400321,那么m1是321
int m1 = _x / (pow(10, len - 1));
m1 = m1*pow(10, len - 1);
m1 = _x - m1;
//计算输入x的最高位那个数出现的次数,当前输入时400321,只计算4出现的次数
c[m] = c[m] + (m1 + 1);
int after = (pow(10, len - 1));
//dv是_x的长度,之后,和得到的新的_x的长度作差,然后减去1,得到0的个数,输入400321 ,下面的变量NumOfZero将会等于2
int dv = get_length(_x);
//获取除最高位以外,剩余的数字_x,下一轮循环用剩余的数字_x作为输入,现在,更新后的 _x==321 ,下一轮循环,将使用321作为输入
_x = _x % after;
//把输入x中的0算进去,例如把400321中的两个0算进去
int NumOfZero= (dv - get_length(_x) - 1)*(_x + 1); //在这里,(2)* 322, 计算400321中两个0出现的次数
c[0] = c[0] + NumOfZero;
}
//把多余的0减去
c[0] = c[0] - s(get_length(x));
for (int i = 0;i <= 9;i++) {
cout << "数字" << i << "用的次数:" << c[i] << endl << endl;
}
}
}
//n是位数,表示几位数0~9用的次数
int f(int n) {
return n*pow(10, (n - 1));
}
//n是输入x的位数,去除多余的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以外的数字的位数,例如400321,调用此函数以后,返回值就是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
网友评论