今天数据结构课程开课了,早就听说这门课的重要性,于是决定每上完一次课将当堂学过的东西复习一下,然后做一下习题。这里记录一下自己的实现。
第一章绪论的内容并不多,主要是后面有5个算法设计题,这些算法也不难。所以今天的任务还算简单啦。
第一题:
/**试写一算法,自大到小依次输出顺序读入的三个整数X,Y和Z的值*/ void SortThreeNum();其实这个题不写不知道,一写还真看出自己有多菜来了。本以为很简单,结果却想了很长时间也没想出个简单方法,最后想出来的方法与答案相比弱爆了。底子欠佳啊
void SortThreeNum() { int num1, num2, num3; printf("请输入三个整数(用逗号隔开)\n"); scanf("%d,%d,%d", &num1, &num2, &num3); int max = num1, min = num1; if (num1 > num2) { min = num2; } if (min > num3) { min = num3; } if (num1 < num2) { max = num2; } if (max < num3) { max = num3; } //书中给出的答案 // int temp; // if (num1 < num2) { // temp = num1; num1 = num2; num2 = temp; // } // if (num2 < num3) { // temp = num3; num3 = num2; // if (num1 >= temp) { // num2 = temp; // } else { // num2 = num1; // num1 = temp; // } // } printf("%d %d %d\n", max, num1 + num2 + num3 - max - min, min); }
/**已知k阶斐波那契序列的定义为 f0 = 0, f1 = 0, f2 = 0…………fk-2 = 0, fk-1 = 1; fn = fn-1 + fn-2 + ………… + fn-k, n = k, k + 1, ………… 试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现*/ void CalculateFibonacci(int k, int m);
/** *分析:k阶斐波那契序列的第m项的值f[m]=f[m-1]+f[m-2]+......+f[m-k] *=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1] *=2*f[m-1]-f[m-k-1] */ void CalculateFibonacci(int k, int m) { int temp[m + 1]; if (m < 0) { return; } if (m <= k - 2) { printf("0\n"); return; } else if (m == k - 1 || m == k) { printf("1\n"); return; } for (int i = 0; i <= k - 2; i++) { temp[i] = 0; } temp[k - 1] = 1; temp[k] = 1; int j = 0; for (int i = k + 1; i <= m; i++, j++) { temp[i] = 2 * temp[i - 1] - temp[j]; } printf("%d\n", temp[m]); }
/**假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为 项目名称 性别 校名 成绩 得分 编写算法,处理上述表格,以统计各院校的男女总分和团体总分,并输出*/ void HandleTable();
typedef enum {A, B, C, D, E} SchoolType; typedef enum {female, male} SexType; typedef struct { SchoolType school; char projectName[20]; SexType sex; int score; }Component; typedef struct { int maleSum; int femaleSum; int totalSum; }SumScore; #define TimesOfMatches 20 Component report[TimesOfMatches]; SumScore result[5]; void HandleTable() { for (int i = 0; i < TimesOfMatches; i++) { SchoolType schoolNum = report[i].school; int score = report[i].score; if (report[i].sex == male) { result[schoolNum].femaleSum += score; } else { result[schoolNum].maleSum += score; } result[schoolNum].totalSum += score; } }
/**试编写算法,计算i!*2^i(i=0,1,...,n-1)的值并分别存入数组a[arrsize]的各个分量中 假设计算机中允许的整数最大值为MAXINT,则当n>MAXINT或对某个k(0<=k<=n-1)使k!*2^k>MAXINT时 应按出错处理,注意选择你认为较好地出错处理方法*/ void CalculateExp(int n);
#define MAXINT 65535 #define ARRSIZE 20 void CalculateExp(int n) { if (n > ARRSIZE || n <= 0) { printf("n值出错"); return; } int a[ARRSIZE]; //表示阶乘结果 int factorial = 1; //表示2的i次幂 int power = 1; for (int i = 0; i < ARRSIZE; i++) { a[i] = 0; } for (int i = 0; i < n; i++) { if (i != 0) { if (MAXINT - i * factorial * power * 2 >= 0) { //合理 a[i] = i * factorial * power * 2; factorial *= i; power *= 2; } else { //溢出 printf("溢出\n"); return; } } else { //首次循环单独处理 a[i] = 1; } } for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); }
/**试编写算法求一元多项式Pn(x) = ∑(i:0...n)(a[i]*x^i)的值Pn(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。 注意选择你认为较好地输入输出方法,本题的输入为a[i](i = 0,1,...n),xn和n,输出为Pn(x0)*/ void CalculatePolynome();
#define MAX_POWER 20 void CalculatePolynome() { //最高次数 int n; //存放每一项系数 int a[MAX_POWER]; //预计算的值 int x0; printf("请输入最高次数n\n"); scanf("%d", &n); if (n >= MAX_POWER) { printf("n出错\n"); return; } printf("请依次输入每一项的系数a[i](从小到大)\n"); for (int i = 0; i <= n; i++) { scanf("%d", &a[i]); } printf("请输入要计算的值x0\n"); scanf("%d",&x0); int result = a[0]; for (int i = 1, j = x0; i <= n; i++,j *= x0) { result += a[i] * j; } printf("%d\n", result); }