C语言数据结构-实验一 C语言回顾及算法分析

注意:现在偷的懒以后都要补回来的!

希望大家认真学好数据结构,不希望后悔!

  1. 阶乘求和
    【问题描述】求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。(注:有多个测试数据)
    【输入形式】n
    【输出形式】Sn的值
    【样例输入】5
    【样例输出】153
    【样例说明】
    有多组测试数据,可以连续输出结果。
#include 
int main()
{
    long long n,sum=0,a=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            a*=j;
        }
        sum+=a;
        a=1;
    }
    printf("%lld",sum);
    return 0;
}
  1. 字符统计
    【问题描述】输入字符串,统计字符串中字母(包括大小写)、空格的个数。
    【输入形式】字符串(包括字母、空格、数字和其他字符)
    【输出形式】字母个数 空格个数
    【样例输入】%4dB *hg #
    【样例输出】4 2
    【样例说明】
    输入字符串以换行符为结束。测试数据有多组。
#include 
int main()
{
    int n=0,sum=0,i=0;
    char ch[1000];
    gets(ch);
    while (ch[i] != '\0'){
        if ((ch[i]>='A' && ch[i]<'Z') || (ch[i]>='a' && ch[i]<'z')){
            sum++;
        }
        if (ch[i]==' '){
            n++;
        }
        i++;
    }
    printf("%d %d",sum,n);
    return 0;
}
  1. 结构体练习1
    【问题描述】
    录入 n 个学生的成绩,并查询。
    【输入形式】
    第一行输入包括 n、 m(1<=n<=5000,1<=m<=10,000)两个数字。
    接下来 n 行,每行包含学号和成绩,学号用整数表示;成绩为不超过 100 的非负整数。
    接下来 m 行,每行包括一个学号。
    【输出形式】
    输出 m 行,如果查询的学生不存在,输出”not exist!”,否则输出学生的成绩。
    【样例输入】
    5 3
    1 95
    2 34
    3 89
    4 65
    5 90
    2
    5
    8
    【样例输出】
    34
    90
    not exist!
    【样例说明】
    【评分标准】
    数据存储采用结构体。
#include 
typedef struct sc{
    int sno;
    int score;
}sc;
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    sc a[n];
    int b[m];
    for(int i=0;i<n;i++){
        scanf("%d %d",&a[i].sno,&a[i].score);
    }
    for(int i=0;i<m;i++){
        scanf("%d",&b[i]);
    }
    int flag=0;
    for (int j = 0; j < m; j++){
        for(int i=0;i<n;i++){
            if(a[i].sno==b[j]){
                printf("%d\n",a[i].score);
                flag=0;
                break;
            }else{
                flag=1;
            }
        }
        if(flag){
            printf("not exist!\n");
        }
        flag=0;
    }
    return 0;
}
  1. 结构体练习2
    【问题描述】
    录入 n 个学生的成绩,并查询。
    【输入形式】
    第一行输入包括 n、 m(1<=n<=5000,1<=m<=10,000)两个数字。
    接下来 n 行,每行包含姓名和成绩,姓名用字符串表示(全大写字母,长度不超过10);成绩为不超过 100 的非负整数。
    接下来 m 行,每行包括一个姓名。
    【输出形式】
    输出 m 行,如果查询的学生不存在,输出”not exist!”,否则输出学生的成绩。
    【样例输入】
    5 3
    TOM 95
    ROBERT 34
    ALICE 89
    WEWI 65
    GRACE 90
    ROBERT
    GRACE
    POPO
    【样例输出】
    34
    90
    not exist!
    【样例说明】
    【评分标准】
    数据存储采用结构体。
#include 
#include 
typedef struct sc{
    char name[11];
    int score;
}sc;

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    sc a[n];
    char b[m][11];
    for(int i=0;i<n;i++){
        scanf("%s %d",a[i].name,&a[i].score);
    }
    for(int i=0;i<m;i++){
        scanf("%s",b[i]);
    }
    int flag=0;
    for (int j = 0; j < m; j++){
        for(int i=0;i<n;i++){
            if(strcmp(a[i].name,b[j])==0){
                printf("%d\n",a[i].score);
                flag=0;
                break;
            }else{
                flag=1;
            }
        }
        if(flag){
            printf("not exist!\n");
        }
        flag=0;
    }
    return 0;
}
  1. 最大子列和问题
    【问题描述】给定整数a1,a2,a3,…an(可能有负数),求子列和的最大值(如果所有整数均为负数,则最大子列和为0)。
    【输入形式】第一行输入n,为整数个数,第二行输入n个整数(可以有负数)。
    【输出形式】输出最大子列和。
    【样例输入】
    10
    -9 10 -11 8 -7 9 7 -4 8 -7
    【样例输出】
    21
    【样例说明】
    请大家分别用不同的方法完成此题并注释说明。
#include 
int main()
{
    int n,m,count=0,index,p=0;
    scanf("%d",&n);
    int b[n];
    for(int i=0;i<n;i++){
        scanf("%d",&b[i]);
    }
    for(int i=0;i<n;i++){
        if (b[i]>0){
            index=i;
            break;
        }else if(i+1==n){
            printf("0");
            return 0;
        }
    }
    int max;
    for (int i = index; i < n; i++){
        int sum=0;
        for(int j=i;j<n;j++){
            sum+=b[j];
            if (max<sum){
                max=sum;
            }
        }
    }
    printf("%d",max);
    return 0;
}

程序片段

  1. 最大公约数与最小公倍数
    【问题描述】写两个函数,分别求两个正整数的最大公约数和最小公倍数,主函数调用这两个函数,并输出结果。两个正整数(a,b<100)由键盘输入。
    【输入形式】两个正整数(以空格分隔)
    【输出形式】最大公约数 最小公倍数(以空格分隔)
    【样例输入】6 15
    【样例输出】3 30
#include 
int gcd(int n,int m){
    int a=1,b,c;
    while (a){
        a=n%m;
        n=m;
        m=a;
    }
    return n;
}

int lcm(int n,int m){
    return n*m/gcd(n,m);
}

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    if (m>n){
        int a=m;
        m=n;
        n=a;
    }
    printf("%d %d",gcd(n,m),lcm(n,m));
    return 0;
}

你可能感兴趣的:(C语言数据结构,经验分享,c语言,数据结构,其他,算法)