运算的时间为
710 秒(100 多天),又每秒可执行基本操作(根据这些操作来估算算法时间复杂度)
510 次。
试问在此条件下,这两个算法可解问题的规模(即 n 值的范围)各为多少?哪个算法更适宜?请说明理由。
解:
2 n
1210
n=40
10
10n
12
n=16
则对于同样的循环次数 n,在这个规模下,第二种算法所花费的代价要大得多。故在这个规模下,第
一种算法更适宜。
1.12 设有以下三个函数:
nf
4
21
n
2
n
1000
,
ng
15
n
4
500
n
3
,
nh
500
n
5.3
n
log
n
请判断以下断言正确与否:
(1) f(n)是 O(g(n))
(2) h(n)是 O(f(n))
(3) g(n)是 O(h(n))
(4) h(n)是 O(n3.5)
(5) h(n)是 O(nlogn)
解:(1)对 (2)错 (3)错 (4)对 (5)错
1.13 试设定若干 n 值,比较两函数
2n 和
50
n
log
n
2
的增长趋势,并确定 n 在什么范围内,函数
2n 的值
大于
50
n
log
n
2
的值。
解:
2n 的增长趋势快。但在 n 较小的时候,
50
n
log
n
2
的值较大。
当 n>438 时,
2
n
50
n
log
n
2
1.14 判断下列各对函数 nf
n
时,哪个函数增长更快?
(1)
(2)
(3)
(4)
和 ng ,当
310!
n
,
25
ng
n
nf
10 2
n
ln
,
ng
2 4
n
n
7
nf
ln
!
n
5.2
13n
nf
1.2
n
nf
2 3
n
14
n
22
n
,
ng
ln
2!
n
n
,
ng
2
n
5
n
n
解:(1)g(n)快 (2)g(n)快 (3)f(n)快 (4) f(n)快
1.15 试用数学归纳法证明:
(1)
(2)
n
2
i
i
1
nn
21
n
6/1
0n
i
x
x
n
/11
x
1
x
n
,1
0
n
i
0
i
2
1
i
1
n
n
(3)
(4)
n
2
1
1n
1
2
i
i
1
2
n
1n
1.16 试写一算法,自大至小依次输出顺序读入的三个整数 X,Y 和 Z 的值
解:
int max3(int x,int y,int z)
{
}
if(x>y)
else
if(x>z) return x;
else return z;
if(y>z) return y;
else return z;
1.17 已知 k 阶斐波那契序列的定义为
0 f
0
,
1 f
0
,…,
2 kf
0
,
1 kf
1
;
f
n
f
n
1
f
2
n
f
kn
,
n
,
kk
,1
试编写求 k 阶斐波那契序列的第 m 项值的函数算法,k 和 m 均以值调用的形式在函数参数表中出现。
解:k>0 为阶数,n 为数列的第 n 项
int Fibonacci(int k,int n)
{
}
if(k<1) exit(OVERFLOW);
int *p,x;
p=new int[k+1];
if(!p) exit(OVERFLOW);
int i,j;
for(i=0;i
项目名称
性别
校名
成绩
得分
编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。
解:
typedef enum{A,B,C,D,E} SchoolName;
typedef enum{Female,Male} SexType;
typedef struct{
char event[3]; //项目
SexType sex;
SchoolName school;
int score;
} Component;
typedef struct{
int MaleSum;
//男团总分
int FemaleSum;//女团总分
int TotalSum; //团体总分
} Sum;
Sum SumScore(SchoolName sn,Component a[],int n)
{
}
Sum temp;
temp.MaleSum=0;
temp.FemaleSum=0;
temp.TotalSum=0;
int i;
for(i=0;iarrsize 或对某个
k
1
k
n
,使
k
k
2!
max
int
时,
应按出错处理。注意选择你认为较好的出错处理方法。
解:
#include
#include
#define MAXINT 65535
#define ArrSize 100
int fun(int i);
int main()