DC01PE06
【题目】试写一算法,如果三个整数a,b和c的值不是依次非递增的,则通过交换,令其为非递增。
要求实现下列函数:
void Descend(int &a, int &b, int &c);
/* 通过交换,令 a >= b >= c */
void Descend(int &a, int &b, int &c) { // 通过交换,令 a >= b >= 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;
}
}
DC01PE08
【题目】试编写算法求一元多项式P(x) = a0 + a1x + a2x^2 + ... + anx^n的值P(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。
要求实现下列函数:
float Polynomial(int n, int a[], float x0);
/* 求一元多项式的值P(x0)。 */
/* 数组a的元素a[i]为i次项的系数,i=0,1,...,n */
float Polynomial(int n, int a[], float x){
// Add your code here
int k; //倒着计算,k为多项式各次项的幂
float p = 0; //p为多项式各项的值
float sum = 0; //sum为多项式的值
for(k = n;k >= 0;k--){ //幂从n依次减小到0
p = a[k]*pow(x,k);
sum = sum + p;
}
return sum;
}
DC01PE11
【题目】已知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 */
Status Fibonacci(int k, int m, int &f) {
int t[50],i,j,sum;
if(k <= 1 || m < 0) //错误的序列或错误的项数
return ERROR;
//接下来,将序列复制到数组t中
for(i = 0;i <= k-2;i++)
t[i]=0; //前k-2项全为0
t[k-1]=1; //f(k-1)=1
for(i = k;i <= m;i++){ //从k到m项将序列各项计算并复制到数组t中
sum = 0; //每次循环前要把中间变量sum置0
for(j = i - k;j < i;j++) //第n项等于第n项的前k项和
sum += t[j]; //计算i的前k项和
t[i]=sum;
}
f=t[m]; //求得第m项的值f由引用参数返回
return OK;
}
DC01PE18
【题目】试编写算法,计算i!×2^i的值并存入数组a[0..n-1]的第i-1个分量中 (i=1,2,…,n)。假设计算机中允许的整数最大值为MAXINT,则当对某个k(1≤k≤n)使k!×2^k>MAXINT时,应按出错处理。注意选择你认为较好的出错处理方法。
要求实现下列函数:
Status Series(int a[], int n);
/* 求i!*2^i序列的值并依次存入长度为n的数组a;若所有 */
/* 值均不超过MAXINT,则返回OK,否则返回EOVERFLOW */
Status Series(int a[], int n) {
int sum=0,m=1,k=2,i=1;
if(n <= 0) return ERROR;
for(i;i <= n;i++) {
sum = m*k; //各项的值
//改变因数m、n的值以完成下一次sum
m *= (i+1); //m每次乘(i+1),递增这个因数即实现i的阶乘运算
k *= 2;//k每次乘2,递增这个因数即实现2的平方运算
a[i-1] = sum;//将sum存入数组a
if(a[i-1] > MAXINT) //超过允许的整数最大值
return EOVERFLOW;
}
return OK;
}
DC01PE49
【题目】试写一算法,由长度为n的一维数组a构建一个序列S。
要求实现下列函数:
Status CreateSequence(Sequence &S, int n, ElemType *a);
/* 由长度为n的一维数组a构建一个序列S,并返回OK。 */
/* 若构建失败,则返回ERROR */
序列的定义为:
typedef struct {
ElemType *elem;
int length;
} Sequence;
Status CreateSequence(Sequence &S, int n, ElemType *a) {
if (NULL == a || n <= 0)
return ERROR;
S.length = n;
S.elem = (ElemType*)malloc(n*sizeof(ElemType));
int i;
ElemType *p;
p=S.elem;
for (i = 0;p < S.elem+n;p++,i++){
*p=a[i];
}
return OK;
}
DC01PE61
【题目】链表的结点和指针类型定义如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
试写一函数,构建一个值为x的结点。
要求实现下列函数:
LinkList MakeNode(ElemType x);
/* 构建一个值为x的结点,并返回其指针。 */
/* 若构建失败,则返回NULL。 */
LinkList MakeNode(ElemType x) {
LNode *p;
p = (LNode*)malloc(sizeof(LNode));
if(NULL == p)
return ERROR;//构建失败返回NULL
p->data = x;
p->next = NULL;
return p;//构建成功返回其指针
}
DC01PE63
【题目】链表的结点和指针类型定义如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
试写一函数,构建长度为2且两个结点的值依次为x和y的链表。
要求实现下列函数:
LinkList CreateLinkList(ElemType x, ElemType y);
/* 构建其两个结点的值依次为x和y的链表。*/
/* 若构建失败,则返回NULL。 */
LinkList CreateLinkList(ElemType x, ElemType y) {
LNode *p,*q;
p = (LNode *)malloc(sizeof(LNode));
q = (LNode *)malloc(sizeof(LNode));
p->data = x;
p->next = q;
q->data = y;
q->next = NULL;
return p;
}
DC01PE65
【题目】链表的结点和指针类型定义如下
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
试写一函数,构建长度为2的升序链表,两个结点的值分别为x和y,但应小的在前,大的在后。
要求实现下列函数:
LinkList CreateOrdLList(ElemType x, ElemType y);
/* 构建长度为2的升序链表。 */
/* 若构建失败,则返回NULL。 */
LinkList CreateOrdLList(ElemType x, ElemType y) {
LNode *p,*q;
p = (LNode *)malloc(sizeof(LNode));
q = (LNode *)malloc(sizeof(LNode));
(x<y)?(p->data = x,q->data = y):(p->data = y,q->data = x);//小的在前,大的在后
p->next = q;
q->next = NULL;
return p;
}