算法的时间复杂性分析

                                算法的时间复杂性分析

一、问题描述:一本书的页码从自然数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
#include
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);  

}

运行
算法的时间复杂性分析_第1张图片

你可能感兴趣的:(算法分析与设计)