1、求下列函数的渐近表达式
(1)3n+10n=O(n)
(2) n/10+2=O(2)
(3)21+1/n=O(1)
(4)10 log3=O(n)
2、分析下面算法属于什么功能,并求算法的时间复杂性函数
int factorial(int n)
{
if (n == 0) return 1;
return n*factorial(n-1);
}
3、算法实现题,要求写出问题的分析过程,然后上机实现算法
统计数字问题:
(1)、问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
(2)、算法设计
给定表示书的总页码的10 进制整数n (1≤n≤10) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
//
// dome1.cpp
// arithmet
//
// Created by ExiFeng on 2019/9/5.
// Copyright © 2019 ExiFeng. All rights reserved.
//
#include <iostream>
#include <cmath>
using namespace std;
int weishu(int n);
int zuigao(int n);
int yushu(int n);
int f(int n);
int s(int n);
void CountDight(int page, int num[]);
int main(){
int page;
while (1) {
cout<<endl<<"请输入一个页码,以0结束程序:"<<endl;
cin>>page;
if (page==0) {
break;
}
int num[10] = {0};
CountDight(page, num);
num[0] = num[0] - s(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(0)-1);
}
int f(int n){
return n*(int)pow(10.0, n-1);
}
int s(int n){
return (1-(int)pow(10.0, weishu(n)))/(1-10);
}
void CountDight(int page, int num[]){
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 CountDight(m1, num);
}