文章为作者记录学习过程,小白一枚,各路大佬多多提建议,感激不尽
前言
本文是作者在学习数据结构时写在课程OJ的代码,在OJ上运行答案正确,编译器版本为GCC5.4,如有不足还望指正。
一、1.16-三整数排序
写一个算法,自大到小依次输出顺序读入的三个整数, x , y 和 z 的值。
输入:输入 x ,y 和 z;
输出:输出自大到小的排序;
输入示例:
1 2 3
输出示例:
3 2 1
代码:
/* 写一个算法,自大到小依次输出顺序读入的三个整数, x , y 和 z 的值 */
#include <stdio.h>
#define EMPTY -1
void main()
{
int a, b, x, y, z;
a = b = x = y = z = EMPTY;
scanf("%d %d %d", &a, &b, &z);
if (a > b){
x = a;
if (b > z)
y = b;/* a > b > z */
else{
if(a > z){
y = z;
z = b;
}/* a > z > b */
else{
x = z;
y = a;
z = b;
}/* z > a > b */
}
}
else{
x = b;
if (a > z)
y = a;/* b > a > z */
else{
if(b > z){
y = z;
z = a;
}/* b > z > a */
else{
x = z;
y = b;
z = a;
}/* z > b > a */
}
}
printf("%d %d %d\n", x, y, z);
}
二、1.17-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 , . . . f_{0}=0, f_{1}=0,...,f_{k-2}=0,f_{k-1}=1;\newline f_{n}=f_{n-1} + f_{n-2} +... +f_{n-k},n=k,k+1,... f0=0,f1=0,...,fk−2=0,fk−1=1;fn=fn−1+fn−2+...+fn−k,n=k,k+1,...试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。
输入:输入为 k 和 m(m 从 0 开始, 对应 m=0)
输出:输出第 m 项的值
输入示例:
2 7
输出示例:
13
代码:
/* 试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。*/
#include <stdio.h>
#include <stdlib.h>
extern int fibonacci(int k, int m);
void main()
{
int k, m;
k = m = 0;
scanf("%d %d", &k, &m);
printf("%d\n", fibonacci(k, m));
}
int fibonacci(int k, int m)
{
int *fibo_k;
int result = 0;
if (m > k)
fibo_k =(int *)malloc((m + 1) * sizeof(int));
else
fibo_k =(int *)malloc((k + 1) * sizeof(int));/* 创建动态数组 */
static int i;
for (i = 0; i < k - 1; i++){
fibo_k[i] = 0;
}
fibo_k[i] = 1;/* 为数组元素赋初始值 */
fibo_k[k] = 1;
if (m <= k){
result = fibo_k[m];
free(fibo_k);
return result;
}
for (i = k + 1; i <= m; i++){
fibo_k[i] = 2 * fibo_k[i - 1] - fibo_k[i - k - 1];
}
result = fibo_k[m];
free(fibo_k);
return result;
}
三、1.18-田径对抗赛
假设有A,B,C,D,E 五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为
项目名称 - 性别 - 校名 - 成绩
编写算法,处理上述表格,以统计个院校的男、女总分和团体总分,并输出
输入: 输入包含多行,每行代表表格中的一行,每个字段以空格分隔
(M代表男生,F代表女生)
输出: 输出每个学校的男,女总分和团体总分,按如下顺序
学校A的男生总分
学校A的女生总分
学校A的团体总分
学校B的男生总分
...
如果某个学校没有男生或女生,则跳过对应的行数(如学校A没有女生,则跳过第二行)
输入示例:
X M A 3
Z M A 4
Y F B 30
输出示例:
A M 7
A 7
B F 30
B 30
代码:
/* 假设有A,B,C,D,E 五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为
* 项目名称 - 性别 - 校名 - 成绩
* 编写算法,处理上述表格,以统计个院校的男、女总分和团体总分,并输出 */
#include <stdio.h>
#define UNDEFINED -1
struct score_tab
{
int sco_M;
int sco_F;
}sch_A, sch_B, sch_C, sch_D, sch_E;
int main()
{
int score, c;
char gender, school;
gender = school = score = c = UNDEFINED;
while ((c = getchar()) != EOF && c != '\n') {
scanf(" %c %c %d", &gender, &school, &score);
getchar();
switch (school) {
case ('A'): {
if (gender == 'M')sch_A.sco_M += score;
else if (gender == 'F')sch_A.sco_F += score;
else {
printf("Error: invalid input.\n");
return 0;
}
break;
}
case ('B'): {
if (gender == 'M')sch_B.sco_M += score;
else if (gender == 'F')sch_B.sco_F += score;
else {
printf("Error: invalid input.\n");
return 0;
}
break;
}
case ('C'): {
if (gender == 'M')sch_C.sco_M += score;
else if (gender == 'F')sch_C.sco_F += score;
else {
printf("Error: invalid input.\n");
return 0;
}
break;
}
case ('D'): {
if (gender == 'M')sch_D.sco_M += score;
else if (gender == 'F')sch_D.sco_F += score;
else {
printf("Error: invalid input.\n");
return 0;
}
break;
}
case ('E'): {
if (gender == 'M')sch_E.sco_M += score;
else if (gender == 'F')sch_E.sco_F += score;
else {
printf("Error: invalid input. Wrong gender!\n");
return 0;
}
break;
}
default: {
printf("Error: invalid input. No such school!\n");
return 0;
}
}
}
if (sch_A.sco_M)printf("%C %C %d\n", 'A', 'M', sch_A.sco_M);
if (sch_A.sco_F)printf("%C %C %d\n", 'A', 'F', sch_A.sco_F);
if (sch_A.sco_M || sch_A.sco_F)printf("%C %d\n", 'A', sch_A.sco_M + sch_A.sco_F);
if (sch_B.sco_M)printf("%C %C %d\n", 'B', 'M', sch_B.sco_M);
if (sch_B.sco_F)printf("%C %C %d\n", 'B', 'F', sch_B.sco_F);
if (sch_B.sco_M || sch_B.sco_F)printf("%C %d\n", 'B', sch_B.sco_M + sch_B.sco_F);
if (sch_C.sco_M)printf("%C %C %d\n", 'C', 'M', sch_C.sco_M);
if (sch_C.sco_F)printf("%C %C %d\n", 'C', 'F', sch_C.sco_F);
if (sch_C.sco_M || sch_C.sco_F)printf("%C %d\n", 'C', sch_C.sco_M + sch_C.sco_F);
if (sch_D.sco_M)printf("%C %C %d\n", 'D', 'M', sch_D.sco_M);
if (sch_D.sco_F)printf("%C %C %d\n", 'D', 'F', sch_D.sco_F);
if (sch_D.sco_M || sch_D.sco_F)printf("%C %d\n", 'D', sch_D.sco_M + sch_D.sco_F);
if (sch_E.sco_M)printf("%C %C %d\n", 'E', 'M', sch_E.sco_M);
if (sch_E.sco_F)printf("%C %C %d\n", 'E', 'F', sch_E.sco_F);
if (sch_E.sco_M || sch_E.sco_F)printf("%C %d\n", 'E', sch_E.sco_M + sch_E.sco_F);
return 0;
}
四、1.19-阶乘
试编写算法,计算 i ! × 2 i ( i = 0 , 1 , . . . , n − 1 ) i!\times2^i(i=0,1,...,n-1) i!×2i(i=0,1,...,n−1) 的值并分别存入数组 a [ a r r s i z e ] a[arrsize] a[arrsize] 的各个分量中。假设计算机中允许的整数最大值为 M A X I N T = 2 32 − 1 MAXINT=2^{32} - 1 MAXINT=232−1,则当 n > a r r s i z e n>arrsize n>arrsize 或对某个 k ( 0 ≤ k ≤ n − 1 ) k(0\leq k\leq n-1) k(0≤k≤n−1) 使 k ! × 2 k > M A X I N T k!\times2^k > MAXINT k!×2k>MAXINT 时,应按出错处理。
输入: 输入为两个数,用空格隔开,分别表示 n n n 和 a r r s i z e arrsize arrsize。其中 0 < n , a r r s i z e ≤ 20 0<n, arrsize\leq 20 0<n,arrsize≤20;
输出: 若没有发生出错,则依次输出 i ! × 2 i ( i = 0 , 1 , . . . , n − 1 ) i!\times2^i(i=0,1,...,n-1) i!×2i(i=0,1,...,n−1) 的每个分量,用空格隔开;若发生出错,则直接输出-1。
输入示例1:
3 10
输出示例1:
1 2 8
输入示例2:
10 9
输出示例2:
-1
输入示例3:
12 15
输出示例3:
-1
代码:
/* 试编写算法,计算 i! * 2^i (i = 0, 1, …, n ? 1) 的值并分别存入数组 a[arrsize]
* 的各个分量中。假设计算机中允许的整数最大值为 MAXINT = 2^32 ? 1, 则当 n > arrsize
* 或对某个 0 ≤ k ≤ n?1 使 k! * 2^k > MAXINT 时,应按出错处理。*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
#define MAXINT INT_MAX
int main()
{
int n, arrsize;
n = arrsize = 0;
scanf("%d %d", &n, &arrsize);
if (n > arrsize){
printf("-1\n");
return 0;
}
int *a ;
a = (int *)malloc((arrsize + 1) * sizeof(int));
a[0] = 1;
for (int i = 1; i < n; i++){
if (MAXINT / (2 * i) < a[i - 1]){
printf("-1\n");
return 0;
}
else
a[i] = a[i - 1] * i * 2;
}
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
五、1.20-求一元多项式的值
编写算法求一元多项式 P n ( x 0 ) = ∑ i = 0 n a i x 0 i P_n(x_0)= \sum^n_{i=0}a_ix_0^i Pn(x0)=∑i=0naix0i 的值 P n ( x 0 ) P_n(x_0) Pn(x0)
输入: 输入第一行为 x 0 x_0 x0 和 n n n, n ≥ 0 n\geq 0 n≥0,以空格分隔;输入第二行为 a i ( i = 0 , 1 , . . . , n ) a_i(i=0,1,...,n) ai(i=0,1,...,n), − 1000 ≤ a i ≤ 1000 -1000\leq a_i\leq 1000 −1000≤ai≤1000,以空格分隔;
输出: 输出 P n ( x 0 ) P_n(x_0) Pn(x0) 的值。
输入示例:
2 2
0 1 2
输出示例:
10
代码:
/* 编写算法求表达式Pn(x0)等于ai*x^i的和 */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
int x0, n, c, i, Pn;
int * a;
x0 = n = c = i = Pn = 0;
a = (int *)malloc((n + 1) * sizeof(int));
scanf("%d %d", &x0, &n);
while ((c = getchar()) != EOF){
scanf("%d", &a[i++]);
}
for (int j = 0; j <= n; j++){
Pn += a[j] * pow(x0, j);
}
printf("%d\n", Pn);
}
总结
第一章题目难度不大,如今回来看当时写的代码,实在有些好笑。