算法的时间复杂性分析
一、问题描述:一本书的页码从自然数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);
}
运行