第1章:绪论
1、三数交换
/**********
【题目】试写一算法,如果三个整数a,b和c的值
不是依次非递增的,则通过交换,令其为非递增。
***********/
void Descend(int &a, int &b, int &c) //这里的引用改变a的值也会改变n的值
/* 通过交换,令 a >= b >= c */
{
/*这里的&a是说给一个变量起一个别名,a的值改变,
原变量即实参的值也改变,但是在dev c++编译不通过*/
int temp;
if(a < b){
temp = a;
a = b;
b = temp;
}
if(a < c)
{
temp = a;
a = c;
c = temp;
}
if(b < c)
{
temp = b;
b = c;
c = temp;
}
}
2、一元多项式求值
/**********
【题目】试编写算法求一元多项式
P(x) = a0 + a1x + a2x^2 + ... + anx^n
的值P(x0),并确定算法中每一语句的执行次数和整个算法
的时间复杂度。
**********/
float Polynomial(int n, int a[], float x)
/* 求一元多项式的值P(x)。 */
/* 数组a的元素a[i]为i次项的系数,i=0,...,n */
{
int i;
float sum;
if(n == 0){
sum = a[0];
return sum;//处理只有a0的情况
}
sum = a[n] * x + a[n-1];
for(i = n-2;i >= 0 ;i --)
{
sum = sum * x + a[i] ;//秦九韶算法
}
return sum;
}
3、k阶斐波那契序列
/**********
【题目】已知k阶裴波那契序列的定义为
f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;
f(n)=f(n-1)+f(n-2)+...+f(n-k), n=k,k+1,...
试编写求k阶裴波那契序列的第m项值的函数算法,
k和m均以值调用的形式在函数参数表中出现。
**********/
Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契序列的第m项的值f,如果能求得,返回OK */
/*否则(如参数k与m不合理),返回ERROR*/
{
//这里的序列定义跟斐波那契数列不太一样
//K不可以为1,因为f(k-2)=0,至少大于等于2
//k-1项总为1,第k项往后等于前面k项之和
//如K = 3,则f(k)=f(2)+f(1)+f(0);
if(k < 2 || m < 0){
return ERROR;
}
//前k-2项都为0
int i,j,t[100] = {
0,0},sum = 0;
if(m < k-1) f = 0;
else if(m == k-1) f = 1;
else {
t[k-1] = 1;//k-1项为1
for(i = k;i <= m;i ++){
//给第k项~m项赋值
for(j = i - k;j < i;j ++){
sum += t[j];//前k项之和
}
t[i] = sum;//赋值给第k项~m项
sum = 0;//记得归零
}
f = t[m];
}
return OK;
}
优化
- 上面的当求第m+1项后明显有问题,而且用来双重循环,耗费时间也比较多,因此优化为下面的解法,可以求出任意项的值,而且只用了一次循环.
Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契序列的第m项的值f,如果能求得,返回OK */
/*否则(如参数k与m不合理),返回ERROR*/
{
if(k <