一、问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。 二、算法设计 给定表示书的总页码的10 进制整数n (1≤n≤10 ) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
提示: 1、 POW函数 原型:float pow(float X,int Y); 头文件:#include 功能:计算x的y次幂。 2、 int weishu(int n); //求位数 int zuigao(int n); //求最高位的数字 int f(int n); //所有n位数中0-9出现的相同次数
#include<iostream> #include<cmath> using namespace std; int weishu(int n); int zuigao(int n); int yushu(int n); int f(int n); int ling(int n); void CountDigit(int page, int num[]); int main() { int page; while (1) { cout << endl << "请输入一个页码,以0结束程序:" << endl; cin >> page; if (page == 0) break; int num[10] = { 0 }; CountDigit(page, num); num[0] = num[0] - ling(page); cout << "数字0~9出现的次数分别为:" << endl; for (int i = 0; i < 10; i++) cout << num[i] << ' '; cout << endl; } return 0; } int weishu(int n) { int i = 0; while (n) { n /= 10; i++; } return i; } int zuigao(int n) { return n / (int)pow(10.0, weishu(n) - 1); } int yushu(int n) //计算这个数除最高位后的余数是多少 { return n % (int)pow(10.0, weishu(n) - 1); } int f(int n) //计算0~9出现的相同次数 { return n * (int)pow(10.0, n - 1); } int ling(int n) //计算多余0的个数,等比数列求和公式,公式q=10 { return (1 - (int)pow(10.0, weishu(n))) / (1 - 10); } void CountDigit(int page, int num[]) //计算page中0~9出现的次数,(统计数字问题) { int n = weishu(page); //求位数 int m = zuigao(page); //求最高位 int m1 = yushu(page); int x = f(n - 1); for (int i = 0; i < 10; i++) num[i] += x * m; for (int i = 0; i < m; i++) num[i] += (int)pow(10.0, n - 1); num[m] += m1 + 1; num[0] += (n - weishu(m1) - 1)*(m1 + 1); if (m1 == 0)return; else CountDigit(m1, num); }运行
