一、问题重述
(1)问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6 页用数字6 表示,而不是06 或006 等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
(2)算法设计
给定表示书的总页码的10 进制整数n (1≤n≤10 ) 。
编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
二、问题分析
(待补充)
三、代码实现
// Created on iPad spades.
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int ans[10];
void f(int n){
//循环求n的位数为length
int tmp = n;
int length;
while(tmp != 0){
tmp/=10;
length++;
}
//求n的最高位为k
int k = n/(int)round(pow(10.0, length-1));
//最高位为k,由推导的公式直接求到k-1000...0到9出现的个数
for(int i = 0; i < 10; i++){
ans[i] += k*(length-1)*(int)round(pow(10.0, length-2));
}
//加上最高位出现的次数
for(int i = 0; i < k; i++){
ans[i] += (int)round(pow(10.0, length-1));
}
//最高位出现的次数
ans[k] += n-k*(int)round(pow(10.0, length-1));
tmp = n - k*(int)round(pow(10.0, length-1));
if(tmp == 0){
return;
}else{
return f(tmp);
}
}
int main(){
memset(ans, 0, 10);
int n = 10;
f(n);
int len = 0;
while(n != 0){
n/=10;
len++;
}
//去除前导0
for(int i = 0;i < len;i++){
ans[0] -= (int)round(pow(10.0, i));
}
for(int i = 0; i < 10; i++){
cout<<ans[i]<<endl;
}
}