zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

C语言大学生考试全面题库

2023-02-18 16:41:12 时间

计算A-B的值

输入描述:

输入两个整数 a,b 输出描述描述:

输出a-b的结果

样式输入:7 4 样式输出:3 源代码:

#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d",a-b);
    return 0;
}  

找出最重的苹果

题目描述:

小明有n个苹果(n<20),每一个苹果都有一定的重量,请找出最重的苹果,并输出该苹果的重量

输入描述:

第一个整数是n,表示苹果的个数,接下来的n个整数是苹果的重量,每个整数之间用空格隔开

输出描述描述:

最重的苹果的重量

样式输入: 2 45 93 样式输出: 93 源代码

#include<stdio.h>
int main()
{
    int n,i,max,a[20];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    max=a[0];
    for(i=1;i<n;i++)
        if(a[i]>max)
            max=a[i];
    printf("%d",max);
    return 0;
}  

汽水瓶

题目描述:

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶, 方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入描述:

输入为一个正整数n(1<=n<=100),表示空汽水瓶个数。

输出描述描述:

输出为一个正整数,表示可换汽水的瓶数。

样式输入: 10 样式输出: 5 源代码

#include<stdio.h>
int main()
{
    int n,sum=0;
    scanf("%d",&n);
    while(n)
    {
        sum+=n/3;
        n=n%3+n/3;
        if(n==2)
        {
            sum++;
            break;
        }
        if(n==1)
            break;
    }
    printf("%d",sum);
    return 0;
}  

密码破译

题目描述: 某组织欲破获一个外星人的密码,密码由一定长度的字串组成。此组织拥有一些破译此密码的长度不同的钥匙,若两个钥匙的长度之和恰好为此密码的长度,则此密码被成功破译。现在就请你编程找出能破译此密码的两个钥匙。 输入描述: 输入第一行为钥匙的个数N(1≤N≤5000) 输入第二行为密码的长度 以下N行为每个钥匙的长度 输出描述描述: 若无法找到破译此密码的钥匙,则输出仅1行0 。若找到两把破译的钥匙,则输出有两行,分别为两把钥匙的编号。若有多种破译方案,则只输出一种即可。 样式输入:

10 80 27 9 4 73 23 68 12 64 92 24

样式输出:

6 7

源代码

#include<stdio.h>
int main()
{
    int n,len,s[100],a=0,b=0,i,j;
    scanf("%d",&n);
    scanf("%d",&len);
    for(i=0;i<n;i++)
        scanf("%d",&s[i]);
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(s[i]+s[j]==len)
            {
                a=i+1;
                b=j+1;
                break;
            }
    if(a!=0&&b!=0)
        printf("%d\n%d",a,b);
    else
        printf("0");
    return 0;
}  

最大公约数

题目描述: 输入两个整数a,b(1≤a,b≤100000),请编写程序求出他们的最大公约数。 输入描述: 输入两个整数a b,用空格隔开 输出描述描述: 输出对应a,b的最大公约数 样式输入:

25 10

样式输出:

5

源代码

#include<stdio.h>
int main()
{
    int min,a,b,i;
    scanf("%d%d",&a,&b);
    min=(a>b)?b:a;
    for(i=min;i>=1;i--)
        if(a%i==0&&b%i==0)
        {
            printf("%d",i);
            break;
        }
    return 0;
}  

字符串比对

题目描述: 有字符串a(长度<=100),b(长度<=10),计算b串在a串中出现的次数。 解题思路: 1、用gets语句从键盘输入两个字符串赋予a,b字符数组; 2、建立两层嵌套循环,外循环至a串结束标志为止,内循环至b串结束标志为止; 3、内循环中比对b串与a串的数据,满足条件时计数,否则break; 4、所有循环结束后输出计数值。 输入描述: 输入为两个字符串,第一个字符串长度小于100,第二个字符串长度小于10; 输出描述描述: 输出为一个正整数; 样式输入:

abcdefghijklmnababcdeabc abc

样式输出:

3

源代码

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100],b[10];
    int i,j,len1,len2,s,sum=0,k;
    gets(a);
    gets(b);
    len1=strlen(a);
    len2=strlen(b);
    for(i=0;i<(len1-len2+1);i++)
    {
        k=i;
        s=0;
        for(j=0;j<len2;j++)
            if(b[j]==a[i])
            {
                s++;
                i++;
            }
        i=k;
        if(s==len2)
            sum++;
    }
    printf("%d",sum);
    return 0;
}  

围圈报数

题目描述: 有n(n<=100)围成一圈,顺序排号(从1排到n)。 从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的那位? 解题思路: 1、定义一个长度为100数组a,初始化为0; 2、接收键盘输入值n,m,数组a的前n-1个元素赋值为1~n; 3、建立两层嵌套循环,外循环至退出人数为n-1为止, 内循环中从0循环至n,将a数组中非0的数据逢m置零,同时记录退出人数; 4、循环全部结束后输出最后留下的一个a数组的非零元素的值。 输入描述: 输入为两个正整数,第一个<=100,第二个<=9; 输出描述描述: 输出为一个正整数; 样式输入:

100 3

样式输出:

91

源代码

#include<stdio.h>
int main()
{
    int a[100];
    int n,m,i,sum=0,k=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        a[i]=i+1;
    while(sum>=0)
    {
        for(i=0;i<n;i++)
            if(a[i]!=0)
            {
                k++;
                if(k==m)
                {
                    a[i]=0;
                    k=0;
                    sum++;
                }
            }
        if(sum==n-1)
            break;
        else
            i=0;
    }
    for(i=n-1;i>=0;i--)
        if(a[i]!=0)
            printf("%d",a[i]);
    return 0;
}  

星期几?

题目描述: 编一个程序,已知今天是星期几,计算出n天后是星期几。要求使用枚举变量。 提示:枚举变量的赋值只能用枚举常量来表示,但是枚举常量均有一个整形数代表,可将改整形数存入枚举变量地址以实现外部赋值的目的。 如:enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat} d1; scanf("%d",&d1); 当键盘输入1时,相当于将d1赋值为Mon,即d1=Mon 枚举变量的输出,只能输出其代表的整形数,如需输出其对应的枚举常量,可借助字符串数组的方式处理; 如:char *p[]={“Sun”,“Mon”,“Tue”,"Wed","Thu","Fri","Sat"}; printf("%s",*(p+2)); 其输出结果为:Tue 输入描述: 输入为两个正整数,第一个数n(n<=6)表示今天是星期几,第二个数m(m<=1000),表示求m天后是星期几; 输出描述描述: 输出为一个长度为3的字符串,表示星期几的名称; 样式输入:

1 4

样式输出:

Fri

源代码

#include<stdio.h>
int main()
{
    int m;
    char p[][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat} n;
    scanf("%d%d",&n,&m);
    m%=7;
    n+=m;
    n%=7;
    printf("%s",*(p+n));
    return 0;
}  

整数各位取奇数

题目描述: 将一个整数中的每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s中的数为:87653142时,t中的数为:7531。 (知识点:控制语句、函数、指针) 输入描述: 输入数据为一个不大于100000000的整形数; 输出描述描述: 输出数据为一个不大于100000000的整形数; 样式输入:

987654321

样式输出:

97531

源代码

#include<stdio.h>
int main()
{
    int s,i,k=0;
    int a[100];
    scanf("%d",&s);
    while(s)
    {
        if((s%10)%2!=0)
            a[k++]=s%10;
        s/=10;
    }
    for(i=k-1;i>=0;i--)
        printf("%d",a[i]);
    return 0;
}  

四位反序数

题目描述: 设N是一个四位数,它的n倍恰好是其反序数(例如:123的反序数是321), 编程,输出一个满足条件的N。(知识点:控制语句) 输入描述: 输入为一个整形数n(2<=n<=9) 输出描述描述: 输出为一个四位数的整形数 样式输入:

9

样式输出:

1089

源代码

#include<stdio.h>
int main()
{
    int n,i,k,a,b,sum;
    scanf("%d",&n);
    for(i=1000;i<10000;i++)
    {
        sum=i;
        b=0;
        k=i*n;
        while(sum)
        {
            a=sum%10;
            b=b*10+a;
            sum/=10;
        }
        if(k==b)
        {
            printf("%d",i);
            break;
        }
    }
    return 0;
}  

字母翻译

题目描述: 编程: 求解下列式中各字母代表的数字并输出 PEAR-ARA=PEA (知识点:控制语句) 输入描述:输出描述描述: 输出为四个数字,以空格分开,依次为代表P E A R 的数字; 样式输入:

样式输出:

8 7 6 5

源代码

#include<stdio.h>
int main()
{
    int p,e,a,r,x,y,z;
    for(p=1;p<=9;p++)
        for(e=0;e<=9;e++)
            for(a=1;a<=9;a++)
                for(r=0;r<=9;r++)
                {
                    x=p*1000+e*100+a*10+r;
                    y=a*100+r*10+a;
                    z=p*100+e*10+a;
                    if(x-y==z)
                        printf("%d %d %d %d",p,e,a,r);
                }
    return 0;
}  

字符串复制

题目描述: 有一个字符串,包括n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成另一个字符串。要求在主函数输入字符串及m值并输出复制结果。 (知识点:控制语句、字符串、指针) 输入描述: 输入为一个字符串(长度小于80)及一个整形数(小于字符串的实际长度) 输出描述描述: 输出为一个字符串 样式输入:

abcdefghijklmnopqrst 8

样式输出:

hijklmnopqrst

源代码

#include<stdio.h>
int main()
{
    char a[80];
    char *p;
    int n;
    gets(a);
    scanf("%d",&n);
    p=a+n-1;
    printf("%s",p);
    return 0;
}  

二维字符数组转换

题目描述: 编写函数fun, 函数的功能是: 将M行N列的二维数组中的字符数据, 按列的 顺序依次放到一个字符串中。 例如, 二维数组中的数据为: W W W W S S S S H H H H 则字符串中的内容应是: WSHWSHWSH。 (知识点:数组、指针) 输入描述: 输入为一个3行4列二维字符数组数据 输出描述描述: 输出为一个长度为12的字符数组; 样式输入:

A B C D E F G H I J K L

样式输出:

AEIBFJCGKDHL

源代码

#include<stdio.h>
void fun(char a[3][5])
{
    int i,j,k=0;
    char s[13];
    for(i=0;i<4;i++)
        for(j=0;j<3;j++)
            printf("%c",a[j][i]);
}
int main()
{
    int i,j;
    char a[3][5],*p;
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
        {
            scanf("%c",&a[i][j]);
            getchar();
        }
    fun(a);
    return 0;    
}  

年龄分组

题目描述: 统计各年龄段的人数。N(N=20)个年龄通过键盘输入,并放在age数组中; 要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中, 把20至29岁年龄段的人数放在d[2]中, 其余依此类推, 把100岁 (含100)以上年龄的人数都放在d[10]中。依次输出d[0]至d[10]。 输入描述: 输入为20个正整数; 输出描述描述: 输出为11个正整数; 样式输入:

1 2 11 12 22 23 33 34 44 45 55 56 66 67 68 88 99 100 101 102

样式输出:

2 2 2 2 2 2 3 0 1 1 3

源代码

#include<stdio.h>
int main()
{
    int a[20];
    int d[11]={0};
    int i;
    for(i=0;i<20;i++)
        scanf("%d",&a[i]);
    for(i=0;i<20;i++)
    {
        if(a[i]>=0 && a[i]<=9)
            d[0]++;
        else if(a[i]>=10 && a[i]<=19)
            d[1]++;
        else if(a[i]>=20 && a[i]<=29)
            d[2]++;
        else if(a[i]>=30 && a[i]<=39)
            d[3]++;
        else if(a[i]>=40 && a[i]<=49)
            d[4]++;
        else if(a[i]>=50 && a[i]<=59)
            d[5]++;
        else if(a[i]>=60 && a[i]<=69)
            d[6]++;
        else if(a[i]>=70 && a[i]<=79)
            d[7]++;
        else if(a[i]>=80 && a[i]<=89)
            d[8]++;
        else if(a[i]>=90 && a[i]<=99)
            d[9]++;
        else
            d[10]++;
    }
    for(i=0;i<10;i++)
        printf("%d ",d[i]);
    printf("%d",d[10]);
    return 0;
}  

分数数列求和

题目描述: 有一个分数数列为: 2/1,3/2,4/3,5/4…… 求出这个数列的前n(n<=20)项之和,保留小数点后4位。 输入描述: 输入一个整数n(n<=20); 输出描述描述: 输出为一个小数,保留小数点后4位; 样式输入:

5

样式输出:

7.2833

源代码

#include<stdio.h>
int main()
{
    int i,k;
    double m,n,a[20];
    scanf("%d",&k);
    a[0]=2;
    for(i=1,m=3,n=2;i<20;i++)
    {
        a[i]=a[i-1]+m/n;
        m++;
        n++;
    }
    printf("%.4lf",a[k-1]);
    return 0;
}  

杨辉三角形

题目描述: 输出n行杨辉三角形,如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 …………………… 输入描述: 输入为一个正整数n<n<=10); 输出描述描述: 输出为n行杨辉三角形; 样式输入:

3

样式输出:

1 1 1 1 2 1

源代码

#include<stdio.h>
int main()
{
    int a[10][10];
    int i,j,n;
    scanf("%d",&n);
    if(n>1)
    {
        for(i=0;i<n-1;i++)
        {
            a[i][0]=1;
            printf("%d",a[i][0]);
            for(j=1;j<i;j++)
            {
                a[i][j]=a[i-1][j-1]+a[i-1][j];
                printf(" %d",a[i][j]);
            }
            if(i>0)
            {
                a[i][i]=1;
                printf(" %d",a[i][i]);
            }
            printf("\n");
        }
            a[n-1][0]=1;
            printf("%d ",a[n-1][0]);
            for(j=1;j<n-1;j++)
            {
                a[n-1][j]=a[n-2][j-1]+a[n-2][j];
                printf("%d ",a[n-1][j]);
            }
            a[n-1][n-1]=1;
            printf("%d",a[n-1][n-1]);
    }
    else
        printf("1");
    return 0;
}  

鞍点

题目描述: 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 输入描述: 输入一个3行3列的二维整形数组; 输出描述描述: 如果鞍点存在,输出其坐标;否则输出-1;如:鞍点位于第一行第三列,则输出1 3; 样式输入:

1 2 3 4 5 6 7 8 9

样式输出:

1 3

源代码

#include<stdio.h>
int main()
{
    int a[3][3],i,j,max,min,k1,k2,k,sum=0;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<3;i++)
    {
        max=a[i][0];
        k1=0;
        for(j=1;j<3;j++)
            if(max<a[i][j])
            {
                max=a[i][j];
                k1=j;
            }
        min=a[0][k1];
        k2=0;
        for(k=1;k<3;k++)
            if(min>a[k][k1])
            {
                min=a[k][k1];
                k2=k;
            }
        if(k2==i)
        {
            sum++;
            printf("%d %d",i+1,k1+1);
        }
    }
    if(sum==0)
        printf("-1");
    return 0;
}  

最长单词

题目描述: 输入一个字符串,将其中最长的单词输出(不含标点符号);如果最长单词的数量有多个,输出第一个即可; 注:大写字母的ascii码从65~90,小写字母的ascii码从97~122 输入描述: 输入为长度小于100的字符串; 输出描述描述: 输出为长度小于100的字符串; 样式输入:

Helo!I am chinese,nice to meet you!

样式输出:

chinese

源代码

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j=1,len,len1,len2,k=0,max=0,s[100]={0};
    char a[100],b[100],c[100];
    gets(a);
    len=strlen(a);
    for(i=0;i<len;i++)
    {
        if((a[i]<='z' && a[i]>='a') || (a[i]>='A' && a[i]<='Z'))
        {
            s[j]++;
            b[k]=a[i];
            k++;
        }
        else
        {
            b[k]='\0';
            if(s[j]>max)
            {
                max=s[j];
                strcpy(c,b);
            }
            k=0;
            j++;
        }
    }
    len2=strlen(c);
    for(i=0;i<len2;i++)
        printf("%c",c[i]);
    return 0;
}  

查找不同的木棍

题目描述: 小明的收集了一些木棍,并测量了每个木棍的长度,记录下来.假设小明有奇数根木棍,只有一个木棍找不到跟它一样长的另外一根木棍.请编程找出这个没有相同长度的木棍,输出它的长度. 知识点: 排序;或者用异或操作 0 异或x=x;x异或x=0;a异或b异或c=a异或(b异或c)=(a异或b)异或c=a异或c异或b 输入描述: 输入包含一个奇数n(n<30000),然后是n个整数,表示每个木棍的长度,并保证只有一根木棍找不到跟他一样长的木棍. 输出描述描述: 输出符合条件的木棍的长度 样式输入:

5 22 76 87 76 22

样式输出:

87

源代码

#include<stdio.h>
int main()
{
    int a[30000],i,n,j,k,sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
        if(a[i]==0)
            k=0;
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(a[i]==a[j])
            {
                a[i]=0;
                a[j]=0;
            }
    for(i=0;i<n;i++)
        if(a[i]!=0)
        {
            sum++;
            printf("%d",a[i]);
        }
    if(sum==0)
        printf("0");
    return 0;
}  

最长上升子序列数(闫博钊)

题目描述: 一个数的序列bi,当b1<b2<...<bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiK),这里1<=i1<i2<...<iK<=N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8) 你的任务,就是对于给定的序列,求出最长上升子序列的长度。 输入描述: 第一行输入序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。 输出描述描述: 输出最长上升子序列的长度 样式输入:

7 1 7 3 5 9 4 8

样式输出:

4

源代码

#include<stdio.h>
int main()
{
    int n,i,j,max=0;
    int a[1000],b[1000];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
        b[i]=1;
    for(i=n-1;i>=1;i--)
        for(j=i-1;j>=0;j--)
            if(a[j]<a[i]&&b[j]==b[i])
                b[j]++;
    for(i=0;i<n;i++)
        if(max<b[i])
            max=b[i];
    printf("%d",max);
    return 0;
}  

求反顺序数

题目描述: 输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321 输入描述: 输入一个整数n, 输出描述描述: 输出一个反顺序的数 样式输入:

123456

样式输出:

654321

源代码

#include<stdio.h>
#include<string.h>
int main()
{
    int len,i;
    char a[100];
    scanf("%s",a);
    len=strlen(a);
    for(i=len-1;i>=0;i--)
        printf("%c",a[i]);
    return 0;
}  

求三个整数的最大公约数

题目描述: 对任意三个整数,求它们的最大公约数 输入描述: 三个整数a,b,c 输出描述描述: a,b,c的最大公约数 样式输入:

4 24 32

样式输出:

4

源代码

#include<stdio.h>
int main()
{
    int a,b,c,max,i,k=0,m=0,n=0;
    int A[100]={1},B[100],C[100];
    scanf("%d%d%d",&a,&b,&c);
    for(i=1;i<=a;i++)
        if(a%i==0)
        {
            A[k]=i;
            k++;
        }
    for(i=0;i<k;i++)
        if(b%A[i]==0)
        {
            B[m]=A[i];
            m++;
        }
    for(i=0;i<m;i++)
        if(c%B[i]==0)
        {
            C[n]=B[i];
            n++;
        }
    printf("%d",C[n-1]);
    return 0;
}  

第几天

题目描述: 输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天, 特殊情况,闰年且输入月份大于3时需考虑多加一天。 输入描述: 输入为三个整数,分别表示年、月、日; 输出描述描述: 输出为一个整数,表示输入的年月日为当年的第几天; 样式输入:

2010 1 1

样式输出:

1

源代码

#include<stdio.h>
int main()
{
    int yy,m,dd,n;
    scanf("%d%d%d",&yy,&m,&dd);
    if(m==1)
        n=dd;
    else if(m==2)
        n=31+dd;
    else if(m==3)
        n=59+dd;
    else if(m==4)
        n=90+dd;
    else if(m==5)
        n=120+dd;
    else if(m==6)
        n=151+dd;
    else if(m==7)
        n=181+dd;
    else if(m==8)
        n=212+dd;
    else if(m==9)
        n=243+dd;
    else if(m==10)
        n=273+dd;
    else if(m==11)
        n=304+dd;
    else
        n=334+dd;
    if(yy%400==0 || (yy%4==0 && yy%100!=0))
        if(m>2)
            n++;
    printf("%d",n);
    return 0;
}  

发放奖金

题目描述: 某车间按工人加工零件的数量发放奖金,奖金分为五个等级:每月加工零件数N < 100者奖金为10元;100 < = N < 110者奖金为30元;110 < = N <120 者奖金为50元;120 < = N <130 者奖金为70元;N > 130者奖金为80元。 请编程,由键盘输入加工零件数量,显示应发奖金数。 输入描述: 输入10个加工零件数量,数量小于400. 输出描述描述: 对每一个加工零件个数,输出应发奖金数,每个奖金数之间用空格隔开 样式输入:

85 85 85 85 85 85 85 85 85 85

样式输出:

10 10 10 10 10 10 10 10 10 10

源代码

#include <stdio.h>
int main()
{
    int a[10],i,b[10];
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    for(i=0;i<10;i++)
    {
        if(a[i]<100)
            b[i]=10;
        else if(a[i]>=100&&a[i]<110)
            b[i]=30;
        else if(a[i]>=110&&a[i]<120)
            b[i]=50;
        else if(a[i]>=120&&a[i]<130)
            b[i]=70;
        else
            b[i]=80;
    }
    for(i=0;i<9;i++)
        printf("%d ",b[i]);
    printf("%d",b[9]);
    return 0;
}