数据结构Online Judge第一章题目(C语言版)

文章为作者记录学习过程,小白一枚,各路大佬多多提建议,感激不尽

前言

本文是作者在学习数据结构时写在课程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,...,fk2=0,fk1=1;fn=fn1+fn2+...+fnk,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,...,n1) 的值并分别存入数组 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=2321,则当 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(0kn1) 使 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,arrsize20

输出: 若没有发生出错,则依次输出 i ! × 2 i ( i = 0 , 1 , . . . , n − 1 ) i!\times2^i(i=0,1,...,n-1) i!×2i(i=0,1,...,n1) 的每个分量,用空格隔开;若发生出错,则直接输出-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 n0,以空格分隔;输入第二行为 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 1000ai1000,以空格分隔;

输出: 输出 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);
}

总结

第一章题目难度不大,如今回来看当时写的代码,实在有些好笑。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值