C语言例题

C语言例题

  1. 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        int x,i,y;
        for (int i = 0; i < 100000; ++i) {
            x=sqrt(i+100);
            y=sqrt(i+268);
            if (pow(x,2)==i+100&&pow(y,2)==i+268){
                printf("%d\n",i);
            }
        }
        return 0;
    }
    
    

  1. 题目:企业发放的奖金根据利润提成。

    • 利润(工)低于或等于10万元时,奖金可提10%;
    • 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
    • 20万到40万之间时,高于20万元的部分,可提成5%;#40万到60万之间时高于40万元的部分,可提成3%;
    • 60万到100万之间时,高于60万元的部分,可提成1.5%;#高于100万元时,超过100万元的部分按1%提成。

    从键盘输入当月利润I,求应发放奖金总数?

    #include <stdio.h>
    
    int main() {
        int bonus;
        float profit;
    
        printf("Please input the proft:");
        scanf("%f",&profit);
        if(profit<=100000){
            bonus=0.1*profit;}
        else if(profit>100000&&profit<200000){
            bonus=(profit-100000)*0.075+10000;
        }
        else if(profit>=200000&&profit<400000){
            bonus=(profit-200000)*0.05+10000+100000*0.075;
        }
        else if(profit>=400000&&profit<600000){
            bonus=(profit-400000)*0.03+200000*0.05+10000+100000*0.075;
        }
        else if(profit>=600000&&profit<=1000000){
            bonus=(profit-600000)*0.015+200000*0.05+10000+100000*0.075+200000*0.03;
        }
        else if(profit>1000000){
            bonus=(profit-1000000)*0.01+200000*0.05+10000+100000*0.075+200000*0.03+400000*0.015;
        }
    
        printf("bonus=%d",bonus);
        return 0;
    }
    
    

  1. 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    #include <stdio.h>
    
    int main() {
        int i,j,k;
        int s=0;
        for (int i = 1; i <5 ; i++) {
            for (int j = 1; j <5 ; j++) {
                for (int k = 1; k <5 ; k++) {
                    if(i!=j&&i!=k&&k!=j){
                        s++;
                        printf("%d%d%d\n",i,j,k);
                    }
                }
            }
        }
        printf("%d",s);
        return 0;
    }
    
    

  1. 题目:输入某年某月某日,判断这一天是这一年的第几天?

    #include <stdio.h>
    
    int main() {
        int year,month,day,a,s;
        printf("Please input the year month and day:");
        scanf("%d,%d,%d",&year,&month,&day);
        if(year%4==0&&year%100!=0){
            switch (month){
                case 1:{printf("Today is the %d day",day);
                }break;
                case 2:{printf("Today is the %d day",day+31);
                }break;
                case 3:{printf("Today is the %d day.",day+31+29);
                }break;
                case 4:{printf("Today is the %d day.",day+31+29+31);
                }break;
                case 5:{printf("Today is the %d day.",day+31+29+31+30);
                }break;
                case 6:{printf("Today is the %d day.",day+31+29+31+30+31);
                }break;
                case 7:{printf("Today is the %d day.",day+31+29+31+30+31+30);
                }break;
                case 8:{printf("Today is the %d day.",day+31+29+31+30+31+30+31);
                }break;
                case 9:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31);
                }break;
                case 10:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30);
                }break;
                case 11:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30+31);
                }break;
                case 12:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30+31+30);
                }break;
            }
        } else{
            switch (month){
                case 1:{printf("Today is the %d day",day);
                }break;
                case 2:{printf("Today is the %d day",day+31);
                }break;
                case 3:{printf("Today is the %d day.",day+31+28);
                }break;
                case 4:{printf("Today is the %d day.",day+31+29+31);
                }break;
                case 5:{printf("Today is the %d day.",day+31+29+31+30);
                }break;
                case 6:{printf("Today is the %d day.",day+31+29+31+30+31);
                }break;
                case 7:{printf("Today is the %d day.",day+31+29+31+30+31+30);
                }break;
                case 8:{printf("Today is the %d day.",day+31+29+31+30+31+30+31);
                }break;
                case 9:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31);
                }break;
                case 10:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30);
                }break;
                case 11:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30+31);
                }break;
                case 12:{printf("Today is the %d day.",day+31+29+31+30+31+30+31+31+30+31+30);
                }break;
            }
        }
        return 0;
    }
    
    

    今天又是废话文学的一天...T-T


  1. 题目:输入三个整数x, y,z,请把这三个数由小到大输出。

    #include <stdio.h>
    
    int main() {
        int x,y,z;
        printf("Please input three numbers:");
        scanf("%d,%d,%d",&x,&y,&z);
        if(x<=y&&x<=z){
            if(y<=z){
                printf("%d,%d,%d",x,y,z);
            } else{
                printf("%d,%d,%d",x,z,y);
            }
        }
        if(y<=x&&y<=z){
            if(x<=z){
                printf("%d,%d,%d",y,x,z);
            } else{
                printf("%d,%d,%d",y,z,x);
            }
        }
        if(z<=x&&z<=y){
            if(x<=y){
                printf("%d,%d,%d",z,x,y);
            } else{
                printf("%d,%d,%d",z,y,x);
            }
        }
        return 0;
    }
    
    

  1. 题目:用*号输出字母C的图案。

    #include <stdio.h>
    
    int main() {
        printf("*********\n");
        printf("*\n");
        printf("*\n");
        printf("*\n");
        printf("*\n");
        printf("*********");
        return 0;
    }
    
    

  1. 题目:输出9+9口诀。

    #include <stdio.h>
    
    int main() {
        int i,j;
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j <=i ; j++) {
                printf("%d*%d=%d ",j,i,i*j);
            }
            printf("\n");
        }
        return 0;
    }
    
    

  1. 题目:古典问题(兔子生惠)∶有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

    #include <stdio.h>
    int Fib(int n){
        if(n<=2){
            return 1;
        } else{
            return Fib(n-1)+Fib(n-2);
        }
    }
    int main() {
        int n,i;
        printf("Please input a number:");
        scanf("%d",&n);
        for (int i = 1; i<=n; i++) {
            printf("%d\n",Fib(i)*2);
        }
        return 0;
    }
    
    

  1. 题目:判断101到200之间的素数。

    #include <stdio.h>
    
    int main() {
        int i,j;
        for (int i = 101; i <200 ; i++) {
            for (int j = 2; j <i ; j++) {
                if (i%j==0){
                    break;
            }
                if(j>=i/2){
                    printf("%d\n",i);
                    break;
            }
                
            }
        }
        return 0;
    }
    
    

    当结果出现多个重复值时可在循环后加入break;


  1. 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

      #include <stdio.h>
      #include <math.h>
      int main() {
      int i,j,k;
    
      for (int i = 100; i < 1000; i++) {
          j=i/10;
          if ((pow(i/100,3)+pow(j%10,3)+pow(i%10,3))==i){
              printf("%d\n",i);
    
          }
      }
      return 0;
    }
    
    

  1. 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

    #include <stdio.h>
    
    int main() {
        int i,x;
        printf("Please input a number:");
        scanf("%d",&x);
        printf("%d=",x);
        for (int i =2; i <=x ; i++) {
            while (x%i==0){
                printf("%d",i);
                x=x/i;
                if(x!=1){
                    printf("*");
        
                }
            }
        }
        return 0;
    }
    
    

  1. 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.

    #include <stdio.h>
    
    int main() {
        int score;
        printf("Please input the score:");
        scanf("%d",&score);
        if (score>=90){
            printf("A");
        } else{
            (score<60)?printf("C"):printf("B");
        }
        return 0;
    }
    

  1. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

    #include <stdio.h>
    
    int main() {
        int m,n,i,j;
        int s=1;
        printf("Please input m and n:");
        scanf("%d,%d",&m,&n);
        //最大公约数:共有质因数的乘积
        //最小公倍数:两个数的乘积/最大公约数
        for (int i = 2; i <=m ; i++) {
            for (int j = 2; j <=n ; j++) {
                if ((m%i==0)&&(n%j==0)){
                    while (i==j){
                        s=s*i;
                        break;  //如果不加则一直在while里循环
                    }
                }
    
            }
        }
        printf("the greatest common divisor is %d\n",s);
        printf("the least common multiple is %d",m*n/s);
        return 0;
    }
    
    

  1. 题目:输入一行字符,分列统计出其中英文字母、空格、数字和其它字符的个数。

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    int main() {
        int i;
        int s1=0;
        int s2=0;
        int s3=0;
        int s4=0;
        char a[100];
        printf("Please input chars:");
        gets(a);
        for (int i = 0; i <strlen(a) ; i++) {
            if (isalpha(a[i])){
                s1++;
            }
            else if(a[i]==' '){
                s2++;
            }
            else if(isdigit(a[i])){
                s3++;
            } else{
                s4++;
            }
        }
        printf("the alpha has %d\n",s1);
        printf("the blanket has %d\n",s2);
        printf("the number has %d\n",s3);
        printf("the other has %d",s4);
        return 0;
    }
    
    

  1. 题目:求s=a+aa+aaa+aaaa+aa. ..a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        int n,i,a;
        int sum=0;
        printf("Please input a number:");
        scanf("%d",&n);
        for (int i = 1; i <=n ; i++) {
            a+=pow(10,(i-1))*2;
            sum+=a;
        }
        printf("%d",sum);
        return 0;
    }
    
    

  1. 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6李1+2+3.编程找出1000以内的所有完数。

    #include <stdio.h>
    
    int main() {
        int i, j, sum;
        for (i = 1; i <= 1000; i++) {   //或者i,j都从2开始sum从1开始
            sum = 0;    
          //必须在for循环中赋值,如果在for循环外面赋值则每次外循环开始都变成0
          //每一个i对应一个sum值因此需要在i循环内重新让sum=0
            for (j = 1; j <= i / 2; j++) {
                if (i % j == 0)
                    sum += j;
            }
            if (sum == i) {
                printf("%d \n", i);
            }
        }
        return 0;
    }
    
    

  1. 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下.求它在第10次落地时,共经过多少米?第10次反弹多高?

    #include <stdio.h>
    
    int main() {
        float h=100;
        int n,i;
        float sum=100;
        for (int i = 1; i <=10 ; i++) {
            h = h / 2.0;
            sum += h;
            if(i==10){
                printf("The tenth height is %f\n", h);
            }
        }
        printf("sum=%f", sum);
        return 0;
    }
    
    

  1. 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

    #include <stdio.h>
    
    int main() {
        int x=1;
        int i,y;
        for (int i = 9; i >=1 ; i--) {
            y=2*(x+1);
            x=y;
            if (i==1){
                printf("There are %d peaches.",x);
            }
        }
        return 0;
    }
    
    

  1. 题目:打印出菱形

    #include <stdio.h>
    
    int main() {
        int i,j,k,l,y;
        int x=1;
        for (int i = 1; i <=4; i++) {
            y=4-i;
            for (int m = y; m >=0 ; m--) {
                printf(" ");
            }
            for (int j = 1; j <=x ; j++) {
                printf("*");
            }
            printf("\n");
            x=2*i+1;
        }
        for (int k = 1; k <4; k++) {
            x=7;
            y=k;
            x=x-2*k;
            for (int m = y; m >=0 ; m--) {
                printf(" ");
            }
            for (int l = 1; l <=x ; l++) {
                printf("*");
            }
            printf("\n");
    
        }
        return 0;
    }
    
    

  1. 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和.

    #include <stdio.h>
    
    int  Fib(n){
        if(n==1){
            return 1;
        }
        else if(n==2){
            return 2;
        }
        else if(n>2){
            return Fib(n-1)+Fib(n-2);
        }
    }
    
    int main() {
        int i,j,a,b;
        float sum=0;
        float s;
        for (int i = 1; i <=20 ; i++) {
            a=Fib(i+1);
            b=Fib(i);
            s=a*1.0/b;
            sum+=s;
        }
        printf("%f",sum);
        return 0;
    }
    
    

  1. 题目:求1+2!+3!+...+20!的和。

    #include <stdio.h>
    
    long int Fac(int n){
        if(n==1){
            return 1;
        }
        if(n>=2){
            return Fac(n-1)*n;
        }
    }
    
    int main() {
        int i;
        long int sum=0;
        for (int i = 1; i <=20 ; i++) {
            sum+=Fac(i);
        }
        printf("1!+2!+...+20!=%ld",sum);
        return 0;
    }
    

  1. 题目:利用递归方法求5!。一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数

    #include <stdio.h>
    int Fac(int n){
        if (n==1){
            return 1;
        }
        if(n>=2){
            return n*Fac(n-1);
        }
    }
    int main() {
        printf("5!=%d",Fac(5));
        return 0;
    }
    
    

  1. 题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

    #include <stdio.h>
    
    void  revWrite(int i){
        char s;
        if(i==1){
            s=getchar();
            putchar(s);
        }
        if(i>=2){
            s=getchar();
            revWrite(i-1);
            putchar(s);
        }
    }
    
    int main() {
        char str[20];
        printf("Please input some chars:");
        revWrite(5);
        return 0;
    }
    
    

  1. 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
    问第4个人岁数,他说比第3个人大2岁。
    问第三个人,又说比第2人大两岁。
    问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

    #include <stdio.h>
    
    int main() {
        int i;
        int five=10;
        for (int i = 1; i <5 ; i++) {
            five+=2;
        }
        printf("%d",five);
        return 0;
    }
    
    

  1. 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        int i,x;
        printf("Please input a number:");
        scanf("%d",&x);
        for (int i = 1; i <=5 ; i++) {
            if(x/pow(10,i)<10&&x/pow(10,i)>0){
                printf("This has %d bits.\n",i+1);
                break;
            }
        }
        if(x<10){
            printf("%d",x);
        } else if(x>=10&&x<100){
            printf("%d%d",x%10,x/10);
        } else if(x>=100&&x<1000){
            printf("%d%d%d",x%100%10,x/10%10,x/100);
        }else if(x>=1000&&x<10000) {
            printf("%d%d%d%d",x%1000%100%10 ,x%1000%100/10, x%1000/100, x/1000);
        }else if(x>=10000&&x<100000) {
    printf("%d%d%d%d%d",x%10000%1000%100%10,x%10000%1000%100/10 ,x%10000%1000/100, x%10000/1000, x/10000);
    }
        return 0;
    }
    

  1. 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

    #include <stdio.h>
    
    int main() {
        int x;
        printf("Please input a number:");
        scanf("%d",&x);
        int a=x%10000%1000%100%10;
        int b=x%10000%1000%100/10;
        int c=x%10000%1000/100;
        int d=x%10000/1000;
        int e=x/10000;
        if(a==e&&b==d){
            printf("This is a palindromic number.");
        }else{
            printf("This is not a palindromic number.");
        }
        return 0;
    }
    
    

  1. 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

    #include <stdio.h>
    
    int main() {
        char c,d;
        printf("Please input a char:");
        c=getchar();
        if(c=='m'||c=='M'){
            printf("It is Monday.");
        }
        else if(c=='w'||c=='W'){
            printf("It is Wednesday.");
        }
        else if(c=='f'||c=='F'){
            printf("It is Friday.");
        }
        else if(c=='t'||c=='T'||c=='s'||c=='S'){
            printf("Please input another char:\n");
            fflush(stdin);
            d=getchar();
            if(d=='u'||d=='D'){
                printf("It is Tuesday.");
            }
            else if(d=='h'||d=='H'){
                printf("It is Thursday.");
            }
            else if(d=='a'||d=='A'){
                printf("It is Saturday.");
            }
            else if(d=='u'||d=='U'){
                printf("It is Sunday.");
            } else{
                printf("Please input correct char.");
            }
        }
        else{
            printf("Please input correct char.");
        }
        return 0;
    }
    
    

    当出现两个getchar()时,第二个getchar的前面要加上fflush(stdin);(清空输入缓冲区) 否则语句无效


  1. 题目:删除一个字符串中的指定字母,如:字符串"aca",删除其中的a字母。

    #include <stdio.h>
    
    int main() {
        char c;
        char str[20]={"swatfyaduqwasnx"};
        printf("Please input a letter:");
        c=getchar();
        for (int i = 0; i <20 ; i++) {
            if(c==str[i]){
                continue;
            }else{
                printf("%c",str[i]);
            }
        }
        return 0;
    }
    
    


  1. 题目:判断一个数字是否为质数。

    #include <stdio.h>
    
    int main() {
        int x;
        int s=0;
        printf("Please input a number:");
        scanf("%d",&x);
        for (int i = 2; i <x/2 ; i++) {
            if(x%i==0){
                s++;
            }
        }
        if(s==0){
            printf("This is a prime.");
        }else{
            printf("This is not a prime.");
        }
        return 0;
    }
    
    

  1. 题目:字符串反转,如将字符串"I like Kobe”反转为“eboK ekil I"。

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[30];
        printf("Please input a series of chars:");
        gets(str);
        int i=strlen(str);
        for ( i-1; i >=0 ;i --) {
            printf("%c",str[i]);
        }
        return 0;
    }
    
    

  1. 题目:求100之内的素数。

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

  1. 题目:求一个3*3矩阵对角线元素之和

    #include <stdio.h>
    
    int main() {
        int a[3][3];
        int sum=0;
        printf("Please input the matrix:\n");
        for (int i = 0; i <3 ; i++) {
            for (int j = 0; j <3 ; j++) {
                scanf("%d",&a[i][j]);
            }
        }
        for (int k = 0; k <3 ; k++) {
                    sum+=a[k][k];
        }
        printf("%d",sum);
        return 0;
    }
    

  1. 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

    #include <stdio.h>
    
    int main() {
        int array[]={1,3,5,7,9,13,16,19};
        int x;
        int y;
      	int length=sizeof(array)/sizeof(int);
        printf("Please input a number:");
        scanf("%d",&x);
        for (int i = 0; i <=length ; i++) {
            if(x<array[i]){
                y=i;
                for (int j = length; j >y ; j--) {
                    array[j]=array[j-1];
                }
               array[i]=x;
                break;
            }
        }
        for (int k = 0; k <=length ; k++) {
            printf("%d ",array[k]);
        }
        return 0;
    }
    
    

  1. 题目:将一个数组逆序输出

    #include <stdio.h>
    
    int main() {
        int array[]={1,2,3,4,5,6,7,8};
        int a= sizeof(array)/ sizeof(int);
        for (int i = a-1; i >=0 ; i--) {
            printf("%d ",array[i]);
        }
        return 0;
    }
    
    

  1. 题目:输出杨辉三角

    #include <stdio.h>
    
    int   Yanghui(int x,int y){
        if(y==0||x==y){
            return 1;
        } else{
            return Yanghui(x-1,y-1)+Yanghui(x-1,y);
        }
    }
    
    int main() {
        int array[10][10];
        for (int i = 0; i <10 ; i++) {
            for (int j = 0; j <=i ; j++) {
                printf("%d    ",Yanghui(i,j));
            }
            printf("\n");
        }
        return 0;
    }
    

  1. 题目:用函数交换两个变量的值

    #include <stdio.h>
    
    int exchange(int x,int y){
        int t;
        t=x;
        x=y;
        y=t;
        printf("%d,%d",x,y);
        return 0;
    }
    
    int main() {
        int x,y;
        printf("Please input two numbers:");
        scanf("%d,%d",&x,&y);
        exchange(x,y);
        return 0;
    }
    

  1. 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    #include<stdio.h>
    int main()
    {
        int a[20],*p,*max,*min,n,t;
        printf("Please input the number of element:");
        scanf("%d",&n);
        printf("Please input the array:");
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);  //数字需要空格输入
        }
        min=max=&a[0];
        for(p=a;p<a+n;p++)  //用地址进行循环遍历
        {
            if(*p<*min){
                min=p;
            }
            if(*p>*max){
                max=p;
            }
        }
        t=a[0];
        a[0]=*max;
        *max=t;
    
        t=a[n-1];
        a[n-1]=*min;
        *min=t;
    
        for(p=a;p<a+n;p++)
            printf("%d ",*p);
        return 0;
    }
    

  1. 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

    #include<stdio.h>
    int main()
    {
        int a[10]={1,2,3,4,5,6,7,8,9,10};
        int *p,m,t;
        printf("Please input the m:");
        scanf("%d",&m);
        for (int i = 1; i <=m ; i++) {
            p=a+9;
            t=*p;
            while(p>a){
                *p=*(p-1);
                p--;
            }
            *p=t;
        }
        
        for (p =a; p <a+10 ; p++) {
            printf("%d   ",*p);
        }
    
        return 0;
    }
    

  1. 题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(约瑟夫环)

    #include <stdio.h>
    int main()
    {
        int a[50], i, n, count, flag=0;
        scanf("%d", &n);
        count=n;
        for (i=1; i<=n; i++)
            a[i]=1;
        for (i=1; ;i++){
            if (i==n+1)
                i=1;//进行第二轮循环
          if (a[i]!=0){
            flag++;
          }	
          else{
            continue;
          }	
            if (flag%3==0){
                a[i]=0;
                count--;
            }
            if (count==1)
                break;
        }
        for (i=1; i<=n; i++)
            if (a[i]!=0)
                printf("%d", i);
        return 0;
    }
    

  1. 题目:写一个函数,求一个字符串的长度,在 main函数中输入字符串,并输出其长度。

    #include <stdio.h>
    
    char Len(char *p){
        int len=0;
        while (p[len]!='\0'){
            len++;
        }
        printf("%d",len);
    }
    
    int main()
    {
        char str[20];
        printf("Please input some chars:");
        gets(str);
        Len(str);
        return 0;
    }
    

  1. 题目:编写input()和output()函数输入,输出5个学生的数据记录。

    #include <stdio.h>
    #include <string.h>
    
    struct student{
        char name[20];
        char sex[5];
        int age;
    };  //等于定义了一种新的数据类型叫struct student
    
    void input(struct student *stu){
        for (int i = 0; i <3 ; i++) {
            scanf("%s%s%d",stu[i].name,stu[i].sex,&stu[i].age);  //空格输入
        }
    }
    
    void output(struct student *stu){
        for (int i = 0; i <3 ; i++) {
            printf("name is %s,sex is %s,age is %d\n",stu[i].name,stu[i].sex,stu[i].age);
        }
    }
    int main(void)
    {
        struct student stu1[3];
    //    for (int i = 0; i <3 ; i++) {
    //        scanf("%s%s%d",stu1[i].name,stu1[i].sex,&stu1[i].age);  //空格输入
    //    }
        input(stu1);
        output(stu1);
    //    for (int j = 0; j <3 ; j++) {
    //        printf("name is %s,sex is %s,age is %d\n",stu1[j].name,stu1[j].sex,stu1[j].age);
    //    }
    //    strcpy(stu1.name,"Mike");   //字符串数组要同时定义并赋值否则无法输出
    //    strcpy(stu1.sex,"man");      //如果需要后面赋值字符串数组需要使用strcpy函数
    //    stu1.age=17;
    //    printf("name is %s,sex is %s,age is %d",stu1.name,stu1.sex,stu1.age);
    
    }
    

    字符串数组要同时定义并赋值否则无法输出 如果需要后面赋值字符串数组需要使用strcpy函数进行输出


  1. 题目:malloc(动态分配内存)/realloc(扩充内存)的用法;创建一个链表。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
    //    int *p=malloc(sizeof(int)*20);
    //    int i=10;
    //    *p=i;
    //    printf("%d",*p);
    //    free(p);
    
        char *p=malloc(sizeof(char)*20);
        strcpy(p,"hello");
        printf("%s,%zd\n",p, sizeof(p));   //%zd与sizeof()严格对应
    
        char *q=realloc(p, sizeof(char)*20);
        strcat(q,"yuanyu");
        printf("%s,%zd",q, sizeof(q));   //%zd与sizeof()严格对应
    
        free(q);
        free(p);
    }
    

    %zd与sizeof()严格对应


  1. 题目:输入一个整数,并将其反转后输出。

    #include <stdio.h>
    
    int main(void)
    {
        int x;
        printf("Please input a number:");
        scanf("%d",&x);
        int m;
        int n=0;
        while (x!=0){
            m=x%10;
            n=n*10+m;
            x=x/10;
        }
        printf("%d",n);
    }
    

  1. 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n;当输入n为奇取时,调用函数1/1+1/3+...+1/n

    #include <stdio.h>
    float sum=0;
    int Sum(x){
        if(x%2==0&&x!=0){
            for (int i = 1; i <=x/2 ; i++) {
                while(x>0){
                    sum+=1.0/x;
                    x=x-2;
                }
    
            }
            printf("%f",sum);
        }
        if(x%2==1){
            for (int i = 1; i <=(x-1)/2 ; i++) {
                while(x>0){
                    sum+=1.0/x;
                    x=x-2;
                }
    
            }
            printf("%f",sum);
        }
    }
    int main(void)
    {
        int x;
        printf("Please input a number:");
        scanf("%d",&x);
       Sum(x);
    }
    

  1. 指向指针的指针(二级指针)

    #include <stdio.h>
    
    int main(void)
    {
        int a=10;
        int *p1=&a;
        int **p2=&p1;
        printf("&a=%x\n",&a);	//61fe14
        printf("*p2=%x\n",*p2);	//61fe14
    
        printf("a=%d\n",a);	//10
        printf("**p2=%d",**p2);	//10
    }
    

  1. 二维指针+数组

    #include <stdio.h>
    
    int main(void)
    {
    //    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    //    int *p0=&a[0];
    //    int *p1=&a[1];
    //    int *p2=&a[2];
    //    printf("%d",*p0);
    
    //    int (*p)[4]=a;  //数组名就是首地址
    //    printf("%d",*((*(p+0))+0));
    
        int a=10;
        int b=20;
        int c=30;
        int *arr[3]={&a,&b,&c};
        int **p_arr=arr;
        printf("%d,%d,%d\n",*arr[0],*arr[1],*arr[2]);
        printf("%d,%d,%d",**(p_arr+0),**(p_arr+1),**(p_arr+2));
    }
    

  1. 二维指针+字符串

    #include <stdio.h>
    
    int main(void)
    {
    //    int *str1="abcd";
    //    int *str2="efgh";
    //    int *str3="ijkl";
    //    int *str[3]={str1,str2,str3};
    //    printf("%s,%s,%s",str[0],str[1],str[2]);
    
        char *a[]={"mom","dad","sister","brother"};
        char **p;
        for (int i = 0; i <4 ; i++) {
            p=&a[i];
            printf("%s\n",*p);
        }
    }
    

  1. 结构体+指针-找年龄最大的人

    指针可以指向任意内存 为了保证指针安全int *p=NULL;(指针没有初始值会报错)

    void没有返回值或没有形参

    gets函数输入字符串不安全,可以使用fgets函数 :fgets(str数组名,30数组长度,stdin);

    #include <stdio.h>
    
    struct man{
        char name[20];
        int age;
    }//person1={"Mike",19};
    person[3]={"Sun",12,"Rani",19,"Danna",61};
    
    int main(void)
    {
       struct man *p;
    //   p=&person1;
        p=person;
        int max=0;
        for (int i = 0; i <3 ; i++) {
            printf("%s,%d\n",p[i].name,p[i].age);
            if(p[i].age>=max){
                max=p[i].age;
            }
        }
        printf("the oldest is %d years old",max);
    //   printf("%s,%d",p->name,p->age);
    }
    

  1. 字符串排序

    必须用strcmp函数来比较两个字符串的大小

    #include <stdio.h>
    
    int main(void)
    {
            int n;
            scanf("%d", &n);
            char str[20],t;
            scanf("%s",str);
        for (int k = 0; k <n ; ++k) {
            for(int i = 0; i < n - 1; i++) {
                if (str[i] > str[i + 1]) {
                    t = str[i];
                    str[i] = str[i + 1];
                    str[i + 1] = t;
                }
            }
        }
            for(int j = 0; j < n; j++){
                printf("%c",str[j]);
            }
    
    }
    

  1. 题目:809*??=800*??+9*??其中??代表的两位数,809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

    #include <stdio.h>
    
    int main(void)
    {
        for (int i = 10; i <100 ; i++) {
            if((809*i==800*i+9*i)&&(809*i>=1000)&&(809*i<10000)&&(8*i>=10)&&(8*i)<1000&&(9*i>=100)&&(9*i)<10000){
                printf("i=%d\n",i);
                printf("809*%d=%d",i,809*i);
            }
        }
    }
    

  1. 题目:八进制转换为十进制

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        int x;
        int i=0;
        int y=0;
        printf("Please input a Oct number:");
        scanf("%d",&x);
        while (x/10>=0&&x!=0){
            y+=(x%10)*pow(8,i);
            i++;
            x=x/10;
        }
        printf("It's decimal is %d",y);
    }
    

  1. 题目:求0-7所能组成的奇数个数。

    pow()是double类型,当输出整型时需要强制转化为int类型

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        int sum;
        for (int n = 1; n <=8 ; n++) {
            if(n==1){
                sum=4;
                printf("The sum is %d\n",sum);
            }else if(n==2){
                sum+=4*7;
                printf("The sum is %d\n",sum);
            } else if (n>=3&&n<=8){
                for (int i = 1; i <=n-2 ; ++i) {
                    sum+=4*7*(int)pow(8,n-2);
                }
                printf("The sum is %d\n",sum);
            }
        }
    }
    

  1. 题目:任何—个大于2的偶数总能表示为两个素数之和。

    #include <stdio.h>
    #include <math.h>
    
    int prime(int n){
        if(n==1) return 0;
        else if(n==2) return 1;
        else if(n%2==0&&n>2) return 0;
        else {
            for (int i = 3; i <sqrt(n)+1 ; i++) {
                if(n%i==0){
                    return 0;
                }
            }
        }
        return 1;
    }
    
    int main(void)
    {
        int x;
        printf("Please input a number:\n");
        scanf("%d",&x);
        if(x>2&&x%2==0){
            for (int j = 2; j <x ; j++) {
                if(prime(j)&&prime(x-j)){
                    printf("%d=%d+%d\n",x,j,x-j);
                }
            }
        }else{
            printf("Please input the right number.\n");
        }
    
    }
    

  1. 题目:判断一个素数能被几个9整除

    #include <stdio.h>
    #include <math.h>
    
    int prime(int n){
        if(n==1) return 0;
        else if(n==2) return 1;
        else if(n>2&&n%2==0) return 0;
        else{
            for (int i = 3; i <sqrt(n)+1 ; i++) {
                if(n%i==0){
                    return 0;
                }
            }
            return 1;
        }
    }
    
    int main(void)
    {
        int s=9;
        int n;
        int i=1;
        printf("Please input a prime:");
        scanf("%d",&n);
        if(prime(n)){
            while (s%n!=0){
                s=s*10+9;
                i++;
            }
            printf("%d",i);
        }
    }
    

  1. 题目:两个字符串连接程序

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char str1[]="I am ";
        char str2[]="yuanu";
    //    strcat(str1,str2);
    //    puts(str1);
    
        char *str=(char *)malloc(strlen(str1)+strlen(str2));
        strcat(str,str1);
        strcat(str,str2);
        puts(str);
        free(str);
    }
    

  1. 题目:结构体变量传递

    #include <stdio.h>
    
    struct stu{
        int age;
        char gender;
    };
    
    void stuChange1(struct stu a){
        a.age=10;
        a.gender='m';
    }
    void stuChange2(struct stu *a){
        a->age=30;
        a->gender='m';
    }
    
    int main(void)
    {
        struct stu  stu1;
        struct stu *p;
        p=&stu1;
        stu1.age=17;
        stu1.gender='w';
        stuChange1(stu1);
        printf("%d,%c\n",stu1.age,stu1.gender);	//17,w
        stuChange2(p);
        printf("%d,%c\n",stu1.age,stu1.gender);	//30,m
    }
    

  1. 题目:读取7个数(1-50)的整数值,每读取一个值,程序打印出该值个数的*

    #include <stdio.h>
    
    int main(void)
    {
        int x;
        printf("Please input seven number:");
        for (int j = 0; j <7 ; j++) {
            printf("Please input the next number:");
            scanf("%d",&x);
            for (int i = 0; i <x ; i++) {
                printf("*");
            }
            printf("\n");
        }
    }
    

  1. 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

    #include <stdio.h>
    
    int main(void)
    {
        int x,a1,a2,a3,a4,t1,t2;
        printf("Please input a number:");
        scanf("%d",&x);
        a4=(x/1000+5)%10;
        a3=(x%1000/100+5)%10;
        a2=(x%1000%100/10+5)%10;
        a1=(x%10+5)%10;
        printf("%d%d%d%d",a1,a2,a3,a4);
    }
    

  1. 题目:猜数游戏。没猜中就给一句提示,大了还是小了;猜中了,问要不要继续玩;不玩拉倒。

    #include <stdio.h>
    
    int main(void)
    {
        int x=100;
        int y;
        char c;
        int flag=1;
        while(flag){
            printf("Please guess a number:");
            scanf("%d",&y);
            if (y>x){
                printf("It's bigger.\n");
            } else if (y<x){
                printf("It's smaller.\n");
            } else if(x==y){
                printf("Congratulations!\n");
            }
            printf("Do you want continue?\n");
            fflush(stdin);
            scanf("%c",&c);
            if(c=='n'||c=='N'){
                flag=0;
            }
        }
    }
    

    第二个scanf输入函数之前必须清楚缓存: fflush(stdin);


  1. 题目:计算字符串中出现子串的个数

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int a,b;
        int sum=0;
        char str1[50]="1234xuxnj78912378322412";
        char str2[20]="12";
        char str[50]="";
        a=(int)strlen(str1);
        b=(int)strlen(str2);
        for (int i = 0; i <a ; i++) {
            if(str1[i]!=str2[0]){
                continue;
            }else{
                int k=0;
                for (int j = i; j <i+b ; j++) {
                   str[k]=str1[j];
                   k++;
                }
                if(strcmp(str,str2)==0)
                   sum++;
            }
       }
            printf("sum=%d",sum);
    }
    

  1. 题目:image

    #include <stdio.h>
    #include <stdlib.h>
    
    struct complex{
        float realPart;
        float imagePart;
    };
    
    //复数赋值
    void assign(struct complex *a, float real, float imag){
        a->realPart=real;
        a->imagePart=imag;
    }
    
    void add(struct complex *c,struct complex *a,struct complex *b){
        c->realPart=a->realPart+b->realPart;
        c->imagePart=a->imagePart+b->imagePart;
    }
    
    void multiply(struct complex *c,struct complex *a,struct complex *b){
        c->realPart=a->realPart*b->realPart-a->imagePart*b->imagePart;
        c->imagePart=a->imagePart*b->realPart+a->realPart*b->imagePart;
    }
    
    void divide(struct complex *c,struct complex *a,struct complex *b){
        c->realPart=(a->realPart*b->realPart+a->imagePart*b->imagePart)/(b->realPart*b->realPart+b->imagePart*b->imagePart);
        c->imagePart=(a->imagePart*b->realPart-a->realPart*b->imagePart)/(b->realPart*b->realPart+b->imagePart*b->imagePart);
    }
    int main(void)
    {
        struct complex *z1;
        struct complex *z2;
        struct complex *z3;
        struct complex *z4;
        struct complex *z;
        z1=(struct complex *)malloc(sizeof(struct complex));    //一定要给定义的指针分配内存,并指向此空间;否则会出现段错误
        z2=(struct complex *)malloc(sizeof(struct complex));
        z3=(struct complex *)malloc(sizeof(struct complex));
        z4=(struct complex *)malloc(sizeof(struct complex));
        z=(struct complex *)malloc(sizeof(struct complex));
        assign(z1,8.0,6.0);
        assign(z2,4.0,3.0);
        multiply(z3,z1,z2);
        add(z4,z1,z2);
        divide(z,z3,z4);
        printf("%f %fi",z->realPart,z->imagePart);
        free(z);
        free(z4);
        free(z3);
        free(z2);
        free(z1);
    }
    

  1. 题目:设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值;请输出所有满足题目条件的a、b、c的值;a、b、c之间用空格隔开;每个输出占一行

    #include <stdio.h>
    
    int main(void)
    {
        int x=0,t;
        for (int N = 1000; N <10000 ; N++) {
            x=N/1000+N%1000/100*10+N%1000%100/10*100+N%1000%100%10*1000;
            if(N*9==x) printf("%d\n",N);
        }
    }
    

  1. 题目:设N是一个4位数,它的9倍恰好是其反序数(如1234的反序数是4321),求N的值;输出题目要求的4位数,如果结果有多组,那么每组结果之间以回车隔开

    #include <stdio.h>
    
    int main(void)
    {
        int x;
        for (int i = 0; i <=3 ; ++i) {
            printf("%d\n",i);
        }
        for (int j = 10; j <32 ; ++j) {
            if(j*j%10==j*j/100) printf("%d\n",j);
        }
        for (int k = 100; k <=256 ; ++k) {
            if(k*k%10==k*k/10000&&k*k%10000/1000==k*k%100/10) printf("%d\n",k);
        }
    }
    

  1. 题目:打印所有不超过256,其平方具有对称性质的数。如2和11就是这样的数,因为2x2 =4,11×11=121

    #include <stdio.h>
    
    int main(void)
    {
        int x;
        for (int i = 0; i <=3 ; ++i) {
            printf("%d\n",i);
        }
        for (int j = 10; j <32 ; ++j) {
            if(j*j%10==j*j/100) printf("%d\n",j);
        }
        for (int k = 100; k <=256 ; ++k) {
            if(k*k%10==k*k/10000&&k*k%10000/1000==k*k%100/10) printf("%d\n",k);
        }
    }
    

  1. 题目:输入一个高度h (1<h≤1000),输出一个高度为h、上底边长度为h的梯形

    #include <stdio.h>
    
    int main()
    {
        int h,x,y;
        printf("Please input the h:\n");
        scanf("%d",&h);
        if(h<1||h>1000) printf("Error!");
        else{
            for (int i = 0; i <h ; i++) {
                x=2*(h-1)-2*i;
                y=h+2*i;
                for (int j = 0; j <x ; j++) {
                    printf(" ");
                }
                for (int j = 0; j <y ; j++) {
                     printf("*");
                }
                printf("\n");
            }
        }
    }
    

  1. 题目:输入是一个三元组,分别是:外筐尺寸n (n为满足0<n <80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。

    #include <stdio.h>
    
    int main()
    {
        int n,x,y=0;
        char c1,c2;
        printf("Please input the value:\n");
        scanf("%d,%c,%c",&n,&c1,&c2);
        if(n<0||n==0||n>80||n==80||n%2==0) printf("Error!");
        char arr[n][n];
        x=n;
        while (x>0){
            if(x%2!=0){
                for (int i = y; i <x ; ++i) {
                    for (int j = y; j <x ; ++j) {
                        arr[i][j]=c2;
                    }
                }
                x--;
                y++;
            } else{
                for (int i = y; i <x ; ++i) {
                    for (int j = y; j <x ; ++j) {
                        arr[i][j]=c1;
                    }
                }
                x--;
                y++;
            }
        }
        arr[0][0]=arr[0][n-1]=arr[n-1][0]=arr[n-1][n-1]=' ';
        for (int k = 0; k <n ; ++k) {
            for (int i = 0; i <n ; ++i) {
                printf("%c",arr[k][i]);
            }
            printf("\n");
        }
    }
    

  1. 题目:输入年、月、日,计算该天是本年的第几天

    #include <stdio.h>
    
    int main()
    {
        int year,month,date,sum=0;
        int arr1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int arr2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
        printf("Please input the year month and date:\n");
        scanf("%d,%d,%d",&year,&month,&date);
        if(year%400==0||(year%100!=0&&year%4==0)){
            for (int i = 0; i <month ; ++i) {
                sum+=arr2[i];
            }
        } else{
            for (int i = 0; i <month ; ++i) {
                sum+=arr1[i];
            }
        }
        printf("Today is the %d day.",sum+date);
    }
    

  1. 题目:给出年分m和一年中的第n天,算出第n天是几月几号,按yyyy-mm-dd的格式将输入中对应的日期打印出来

    #include <stdio.h>
    
    int main()
    {
        int arr1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int arr2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
        int year,month,date,n,i=0;
        printf("Please input the year and n:\n");
        scanf("%d,%d",&year,&n);
        if(year%400==0||(year%100!=0&&year%4==0)){
            while (n>0){
                n-=arr2[i];
                i++;
            }
            month=i-1;
            date=arr2[i-1]+n;
        } else{
            while (n>0){
                n-=arr1[i];
                i++;
            }
            month=i-1;
            date=arr2[i-1]+n;
        }
        printf("%04d-%02d-%02d",year,month,date);
    }
    

  1. 题目:对输入的n个数进行排序并输出,输入的第一行包括一个整数n(1≤n≤100)。接下来的一行包括n个整数。

    #include <stdio.h>
    
    int main()
    {
        int n,t=0;
        int a[10];
        scanf("%d\n",&n);
        for (int i = 0; i <n ; ++i) {
            scanf("%d",&a[i]);
        }
        for (int j = 0; j <n-1 ; ++j) { //n-1次排序
            for (int i = 0; i <n-j-1 ; ++i) {     //每次需要n-j比较
                if(a[i+1]<a[i]) {
                    t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                }
            }
        }
        for (int k = 0; k <n ; ++k) {
            printf("%d ",a[k]);
        }
    }
    

  1. 题目:输入10个整数,彼此以空格分隔。重新排序后输出(也按空格分隔),要求:首先输出其中的奇数,并且按照从大到小的顺序排列;然后输出其中的偶数,并且按照从小到大的顺序排列

    #include <stdio.h>
    
    int main()
    {
        int a[10],t;
        for (int i = 0; i <10 ; ++i) {
            scanf("%d",&a[i]);
        }
        for (int j = 0; j <10 ; ++j) {
            for (int i = 0; i <10-j ; ++i) {
                if(a[i]>a[i+1]) {
                    t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                }
            }
        }
        for (int k = 0; k <10 ; ++k) {
            if(a[k]%2==0) {  //输出偶数由小到大排序
                printf("%d ", a[k]);
            }
        }
        printf("\n");
        for (int l = 9; l >=0 ; l--) {  //输出奇数由大到小排序
            if(a[l]%2!=0){
                printf("%d ",a[l]);
            }
        }
    }
    

  1. 题目:用一维数组存储学号和成绩,然后按成绩排序输出。输入:输入的第一行中包括一个整数N(1≤NS100),它代表学生的个数;接下来的N行中,每行包括两个整数p和q,分别代表每个学生的学号和成绩。输出:按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。如果学生的成绩相同,那么按照学号的大小从小到大排序。

    #include <stdio.h>
    
    typedef struct {
        int number;
        int grade;
    }Student;
    
    int main()
    {
        int N,min;
        Student s[50],s1;
        scanf("%d\n",&N);
        for (int i = 0; i <N ; i++) {
            scanf("%d %d\n",&s[i].number,&s[i].grade);
        }
        for (int j = 0; j <N ; ++j) {
            for (int i = 0; i <N-j ; ++i) {     //按成绩从小到大排序
                if(s[i].grade>s[i+1].grade){
                    s1=s[i];
                    s[i]=s[i+1];
                    s[i+1]=s1;
                }
            }
        }
        for (int k = 0; k <N ; ++k) {		//成绩相等时学号小的在前面
            if(s[k].grade==s[k+1].grade){
                if(s[k].number>s[k+1].number){
                    min=s[k+1].number;
                    s[k+1].number=s[k].number;
                    s[k].number=min;
                }
            }
    
        }
        for (int l = 0; l <N ; ++l) {
            printf("%d %d\n",s[l].number,s[l].grade);
        }
    
    }
    

  1. 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入者排列在前的规则处理。输入多行,首先物入要排序的人的个数,然后输入排序方法0(降序)或1(升序),再分别输入他们的名字和成绩,以一个空格隔开。按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开。

    #include <stdio.h>
    
    typedef struct {
        char name[10];
        int grade;
    }Student;
    
    int main()
    {
        Student s[10],s1;
        int n,order;
        scanf("%d %d\n",&n,&order);   //输入学生人数+输入排序方法:0降序;1升序
        for (int i = 0; i <n ; ++i) {
            scanf("%s %d",s[i].name,&s[i].grade);
        }
        if(order==1){
            for (int i = 0; i <n-1 ; ++i) {
                for (int j = 0; j <n-i ; ++j) {
                    if(s[j].grade>s[j+1].grade){
                        s1=s[j];
                        s[j]=s[j+1];
                        s[j+1]=s1;
                    }
                }
            }
            for (int k = 0; k <n ; ++k) {
                printf("%s %d\n",s[k].name,s[k].grade);
            }
        }
        else if(order==0){
            for (int i = 0; i <n-1 ; ++i) {
                for (int j = 0; j <n-i ; ++j) {
                    if(s[j].grade<s[j+1].grade){
                        s1=s[j];
                        s[j]=s[j+1];
                        s[j+1]=s1;
                    }
                }
            }
            for (int k = 0; k <n ; ++k) {
                printf("%s %d\n",s[k].name,s[k].grade);
            }
        }
    
    }
    

  1. 题目:There is one single line contains the day number d, month name m and year number y(1000≤y≤3000). The month name is the corresponding English name starting from the capital letter.

    #include <stdio.h>
    
    
    int main()
    {
        int d,m,y,sum=0,count=0,t;
        scanf("%d %d %d",&d,&m,&y);
        int arr1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int arr2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
        if((y%4==0&&y%100!=0)||(y%400==0)){
            for (int i = 1; i <m ; ++i) {
                sum+=arr2[i];
            }
        } else{
            for (int i = 1; i <m ; ++i) {
                sum+=arr1[i];
            }
        }
        sum+=d;
        t=sum;
        for (int j = 2023; j >=y ; j--) {
            if((j%4==0&&j%100!=0)||(j%400==0)){
                count++;
            }
        }
        sum=(2023-y)*365+count+55-t;        //计算出距今的天数,以今天为基准
        if(sum%7==0) printf("Friday");
        else if(sum%7==1) printf("Thursday");
        else if(sum%7==2) printf("Wednesday");
        else if(sum%7==3) printf("Tuesday");
        else if(sum%7==4) printf("Monday");
        else if(sum%7==5) printf("Sunday");
        else if(sum%7==6) printf("Saturday");
    }
    

  1. 题目:有一条长度为整数L(1≤L≤10000)的马路,可以将它想象为数轴上长度为L的一条线段,起点是坐标原点,在每个整数坐标点处有一模树,即在0,1,2….L共L+1个位置上有L +1棵树。现在要移走一些树,移走的树的区间用一对数字表示,如“100 200 ”表示移走从100 到200之间(包括端点)的所有树。可能有M(1≤M≤ 100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的棵数。输入:两个整数L(1<I ≤10000)和M(1≤M≤100)。接下来有M组整数,每组有一对数字。

    #include <stdio.h>
    
    typedef struct {
        int head;
        int tail;
    }List;
    
    int main()
    {
        int L,M,sum=0;
        int Line[10000];
        List l[10];
        scanf("%d %d\n",&L,&M);
        for (int i = 0; i <M ; ++i) {
            scanf("%d %d\n",&l[i].head,&l[i].tail);
        }
        for (int j = 0; j <=L ; ++j) {
            Line[j]=1;
        }
        for (int k = 0; k <M ; ++k) {
            for (int i = l[k].head; i <=l[k].tail ; ++i) {
                Line[i]=0;
            }
        }
        for (int m = 0; m <=L ; ++m) {
            if(Line[m]==1) sum++;
        }
        printf("%d",sum);
    }
    

  1. 题目:按照手机键盘输入字母的方式,计算所花费的时间。例如,a b, c都在“1”键上,输入 a只需按1次键,输入c需要连续按3次键。如果连续两个字符不在同一个键上,那么可以直接按;例如,ad需要按2下,kz需要按6下。如果连续两个字符在同一个键上,那么两次按键之间需萎等一段时间:例如 ac,按a之后,需要等一会儿才能按c。现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。现在给读一串字符,计算输入它所花费的时间。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[50];
        int time=0;
        int arr1[26]={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,8,8,8,8};     //字母对应的按键
        int arr2[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};    //字母对应按键次数
        scanf("%s",str);
        int length=strlen(str);
        for (int i = 0; i <length ; ++i) {
            time+=arr2[(str[i]-'a')];	//字母本身需要的按键次数
            if(arr1[(str[i]-'a')]==arr1[(str[i+1]-'a')]){
                time+=2;			//若字母相同则需等待的时间
            }
        }
        printf("%d",time);
    }
    

  1. 题目:输入一个数n,然后输入n个不同的数值,再输入一个值x,输出这个值在数组中的下标(从0开始,若不在数组中则输出-1)。

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

  1. 题目:输入数组长度n输入数组a[1...n]输入查找个数m输入查找数字b[1...m]输出YES or NO 查找有则YES 否则NO;输入有多组数据。每组输入n,然后输入n个整数,再输入m,然后再输入m个整(1<=m,n<=100)。如果在n个数组中输出YES否则输出NO。

    #include <stdio.h>
    
    int main()
    {
        int n,m,u;
        int a[100];
        int b[100];
        scanf("%d\n",&n);
        for (int i = 1; i <=n ; i++) {
            scanf("%d",&a[i]);
        }
        scanf("%d\n",&m);
        for (int j = 1; j <=m ; j++) {
            scanf("%d",&b[j]);
        }
        for (int k = 1; k <=m ; k++) {
            for (u = 1; u <=n ; u++) {
                if(b[k]==a[u]){
                    printf("YES\n");
                    break;
                }
            }
            if(u==n+1){
                printf("NO\n");
            }
        }
    }
    

  1. 题目:一个数如果恰好等于它的各个因子(该数本身除外)之和,如6=3+2+1,那么称该数为“完数”;若因子之和大于该数,则称其为“盈数”。求出2到60之间的所有“完数”和“盈数”。输出2到60之间的所有“完数”和“盈数”,并以如下形式输出:

    E:e1 e2 e3 ...(ei 为完数)
    G:g1 g2 g3… (gi 为盈数)
    其中两个数之间要有空格,行尾不加空格。

    #include <stdio.h>
    
    int main()
    {
        int m=0,n=0;
        int a[60];
        int b[60];
        for (int i = 2; i <=60 ; i++) {
            int sum=0;
            for (int j = 1; j <i ; ++j) {
                if(i%j==0){
                    sum+=j;
                }
            }
            if(sum>i){
                    a[m]=i;
                    m++;
    
            }
            else if(sum==i){
                    b[n]=i;
                    n++;
                }
            }
        printf("E: ");
        for (int k = 0; k <m ; ++k) {
            if(k==m-1){
                printf("%d",a[k]);
            } else{
                printf("%d ",a[k]);
            }
    
        }
        printf("\n");
        printf("G: ");
        for (int l = 0; l <n ; ++l) {
            if(l==n-1){
                printf("%d",b[l]);
            } else{
                printf("%d ",b[l]);
            }
        }
    }
    

  1. 题目:n个小孩围坐成一圈,并按顺时针编号为1,2.…,n,从编号为p的小孩顺时针依次报数,由1报到m,报到m时这名小孩从圈中出去;然后下一名小孩再从1报数,报到m时再出去。以此类推,直到所有小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。输入:第一个是n,第二个是p,第三个是m(0<m,n<300)

    #include <stdio.h>
    
    int main()
    {
        int n,m,p,count,flag=0;
        scanf("%d %d %d",&n,&p,&m);
        count=n;
        int a[100];
        for (int i = 0; i <n ; ++i) {
            a[i]=1;
        }
        for (int j = p;  ; ++j) {
            if(j==n+1){ //进入下一轮
                j=1;
            }
            if(a[j]!=0){    //还在则报数
                flag++;
            } else{         //已不再跳过
                continue;
            }
            if(flag%m==0){
                a[j]=0;
                count--;
                if(count==0){
                    printf("%d",j);
                }else{
                    printf("%d,",j);
                }
            }
            if(count==0){
                break;
            }
        }
    }
    

  1. 题目:有家动物收容所只收留猫和狗,但有特殊的收养规则。收养人有两种收养方式:第一种为直接收养所有动物中最早进入收容所的。第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。给定一个操作序列代表所有事件。若第一个元素为1,则代表有动物进入收容所。第二个元素为动物的编号,正数代表狗,负数代表猫。若第一个元素为2,则代表有人收养动物。第二个元素若为0,则采取第一种收养方式;若为1,则指定收养狗;若为-1,则指定收养猫。请按顺序输出收养动物的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。

    输入:第一个是n,它代表操作序列的次数。接下来是n行,每行有两个值m和t,分别代表题目中操作的两个元素。

    输出:按顺序输出收养动物的序列,编号之间以空格间隔。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
        int come;
        int number;
        int flag;
    }Animal;
    
    typedef struct {
        Animal arr[50];
    }List;
    
    int main()
    {
        List L;
        int n;
        scanf("%d\n",&n);
        for (int i = 0; i <n ; i++) {
            scanf("%d %d\n",&L.arr[i].come,&L.arr[i].number);
            if(L.arr[i].come==1) L.arr[i].flag=1;
            else L.arr[i].flag=0;
        }
        for (int j = 0; j <n ; j++) {
            if(L.arr[j].come==2){
                if(L.arr[j].number==0){     //收养最早进入的动物
                    for (int i = 0; i <n ; ++i) {
                        if(L.arr[i].come==1&&L.arr[i].flag==1){
                            L.arr[i].flag=0;
                            printf("%d",L.arr[i].number);
                            break;
                        }
                    }
                }
                if(L.arr[j].number==1){      //收养狗
                    for (int i = 0; i <n ; i++) {
                        if(L.arr[i].come==1&&L.arr[i].flag==1&&L.arr[i].number>0){
                            L.arr[i].flag=0;
                            printf("%d ",L.arr[i].number);
                            break;
                        }
                    }
                }
                if(L.arr[j].number==-1){   //收养猫
                    for (int i = 0; i <n ; i++) {
                        if(L.arr[i].come==1&&L.arr[i].flag==1&&L.arr[i].number<0){
                            L.arr[i].flag=0;
                            printf("%d ",L.arr[i].number);
                            break;
                        }
                    }
                }
            }
        }
    }
    

  1. 题目:在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来的字符串,并在下一行标出不能匹配的括号。不能匹配的左括品用"$“标注,不能匹配的右括号用"?"标注。

    输入:输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
    输出:对每组输出数据,输出两行,第一行包含原始输入字符,第二行由美元符、问号和空格组成,美元符和问号表示与之对应的左括号和右括号不能匹配。

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[50];
        int stack[50];
        int top=0;
        scanf("%s",str);
        int n=strlen(str);
        printf("%s\n",str);
        for (int i = 0; i <n ; ++i) {
            if(str[i]!=')' && str[i]!='('){
                printf(" ");
                continue;
            }
            if(str[i]=='(') {
                stack[++top]=i;
                printf(" ");
                continue;
            }
            if(str[i]==')'&& top>0) {
                stack[top]=0;
                top--;
                printf(" ");
            } else if(str[i]==')'&& top<=0){
                printf("?");
            }
        }
        for (int j = 1; stack[j]>0 ; j++) {
            printf("$");
        }
    }
    

  1. 题目:读入一个只包含+,-*,/的非负整数计算表达式,计算该表达式的值。输入:测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。输出:对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

    #include <stdio.h>
    
    int main()
    {
        int a;
        while (scanf("%d ",&a) && a!=0)
        {
            double stack[200];
            int top=0;//
            stack[++top] = 1.0 * a;//入栈其他剩余的数字
            char symbol,space;
            double num;
            while (scanf("%c %lf%c",&symbol,&num,&space)!=EOF) //EOF缓冲中有值时才会继续循环
            {
                if (symbol == '+')
                {
                    stack[++top] = num;//1.0 * num;
                }
                else if (symbol == '-')
                {
                    stack[++top] = -1 * num;//-1.0 * num;
                }
                else if (symbol == '*')
                {
                    stack[top] = stack[top] * num;
                }
                else if (symbol == '/')
                {
                    stack[top] = stack[top] / num;
                }
                if(space != ' ')
                {
                    break;      //回车时退出
                }
            }
            double count = 0;//统计数组中的数值的和
            for (int i=1;i<=top;i++)
            {
                count += stack[i];
            }
            printf("%.2lf\n",count);
        }
    }
    

  1. 题目:约19世纪末,在欧洲的商店中出售一种智力玩具:在一块铜板上有三根杆,最左边的杆自上而下、由小到大顺序串着由64个圆盘构成的塔,目的是将最左边杆上的圆盘全部移到右边的杆上,条件是一次只能移动一个圆盘,并且不允许大圆盘放在小圆盘的上面。现在我们改变这个游戏的玩法:不允许直接从最左(右)边移动到最右(左)边(每次移动一定是移到中间杆或从中间杆移出),也不允许大圆盘放到小圆盘的上面。Daisy已经做过原来的汉诺塔问题和汉诺塔II问题,但碰到这个问题时,她想了很久都无法解决。请你帮助她。现在有N个圆盘,她至少需要多少次移动才能把这些圆盘从最左边移到最右边?

    #include <stdio.h>
    
    int hanoi(int n){                       //hanoi(n)=3*hanoi(n-1)+2
        if(n==1){                           //n-1 从A->B->C  hanoi(n-1)
            return 2;                       //n 从A->B       1
        } else if(n>1){                     //n-1 从C->B->A  hanoi(n-1)
            return 3*hanoi(n-1)+2;      	//n 从B->C      1
        }                                   //n-1 从A->B->C  hanoi(n-1)
        return 0;
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        printf("%d",hanoi(n));
    }
    

  1. 题目:由正整数1,2,3..组成了一棵完全二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。比如,n=12,m = 3那么结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

    #include <stdio.h>
    
    int tree(int m,int n){
        if(m>n) return 0;
        else return tree(2*m,n)+tree(2*m+1,n)+1;
    }
    
    int main()
    {
        int m,n;
        scanf("%d %d",&m,&n);
        printf("%d",tree(m,n));
    }
    

  1. 题目:创建并且遍历一个二叉树(先序)

    二叉树的创建一定要使用二级指针

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct TreeNode{
        char data;
        struct TreeNode *lchild,*rchild;
    }Tree;
    
    void CreateTree(Tree **T){
        char a;
        fflush(stdin);
        scanf("%c",&a);
        if(a=='#') *T=NULL;
        else{
            *T=(Tree*)malloc(sizeof(Tree));
            (*T)->data=a;
            CreateTree(&((*T)->lchild));
            CreateTree(&((*T)->rchild));
        }
    }
    
    void PreOrder(Tree *T){
        if(T){
            printf("%c ",T->data);
            PreOrder(T->lchild);
            PreOrder(T->rchild);
        }
    }
    
    int main(){
        Tree *T=NULL;
        CreateTree(&T);
        PreOrder(T);
    }
    

  1. 题目:二叉树的层次遍历

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct TreeNode{
        char data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    typedef struct {
        Tree Que[50];
        int front;
        int rear;
    }Queue;
    
    Queue Q;
    
    void CreateTree(Tree *T){
        char a;
        fflush(stdin);
        scanf("%c",&a);
        if(a=='#') *T=NULL;
        else{
            *T=(Tree)malloc(sizeof(Tree));
            (*T)->data=a;
            CreateTree(&((*T)->lchild));
            CreateTree(&((*T)->rchild));
        }
    }
    
    void IniQueue(){
        Q.rear=0;
        Q.front=0;
    }
    void EnQueue(Tree T){
        Q.Que[++Q.rear]=T;
    }
    Tree DeQueue(){
        return Q.Que[++Q.front];
    }
    int empty(){
        return Q.rear==Q.front;
    }
    void LevelOrder(Tree T){
        Tree p;
        EnQueue(T);
        while(!empty()){
            p=DeQueue();
            printf("%c ",p->data);
            if(p->lchild) EnQueue(p->lchild);
            if(p->rchild) EnQueue(p->rchild);
        }
    }
    
    int main(){
        Tree T=NULL;
        CreateTree(&T);
        IniQueue();
        LevelOrder(T);
    }
    

  1. 题目:根据先序序列和中序序列构建二叉树,并用后序遍历输出

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct TreeNode{
        char data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    void PostOrder(Tree T){
        if(T){
            PostOrder(T->lchild);
            PostOrder(T->rchild);
            printf("%c",T->data);
        }
    }
    
    void Rebuild(Tree *T,char *prestr,char *instr,int l1,int h1,int l2,int h2){
        *T=(Tree)malloc(sizeof(Tree));
        (*T)->data=prestr[l1];
        int root;
        for (root = 0; root <h2 ; root++) {
            if(instr[root]==prestr[l1]) break;
        }
        if((root-l2)!=0){   //左子树是否为空
            Rebuild(&(*T)->lchild,prestr,instr,l1+1,l1+root-l2,l2,root-1);
        } else (*T)->lchild=NULL;
        if((h2-root)!=0){   //右子树是否为空
            Rebuild(&(*T)->rchild,prestr,instr,h1-h2+root+1,h1,root+1,h2);
        } else (*T)->rchild=NULL;
    }
    
    int main(){
        Tree T=NULL;
        char prestr[30],instr[30];
        scanf("%s %s",prestr,instr);
        int len1=strlen(prestr);
        int len2=strlen(instr);
        Rebuild(&T,prestr,instr,0,len1-1,0,len2-1);
        PostOrder(T);
    }
    

  1. 题目:根据带‘#’(空叶子结点)的先序序列重建二叉树

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct TreeNode{
        char data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    int k=0;
    void PreRebuild(Tree *T,char *prestr){    //根据带空叶子结点的先序序列重建二叉树
        if(prestr[k]=='#'){
            k++;
            *T=NULL;
        }
        else{
            *T=(Tree)malloc(sizeof(Tree));
            (*T)->data=prestr[k];
            k++;
            PreRebuild(&(*T)->lchild,prestr);
            PreRebuild(&(*T)->rchild,prestr);
        }
    }
    
    void PreOrder(Tree T){
        if(T){
            printf("%c ",T->data);
            PreOrder(T->lchild);
            PreOrder(T->rchild);
        }
    }
    
    int main(){
        Tree T=NULL;
        char prestr[30];
        scanf("%s",prestr);
        PreRebuild(&T,prestr);
        printf("\n");
        PreOrder(T);
    }
    

  1. 题目:二叉排序树的插入

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct TreeNode{
        int data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    
    void CreateTree(Tree *T){
        int a;
        fflush(stdin);
        scanf("%d",&a);
        if(a==0) *T=NULL;
        else{
            *T=(Tree)malloc(sizeof(Tree));
            (*T)->data=a;
            CreateTree(&((*T)->lchild));
            CreateTree(&((*T)->rchild));
        }
    }
    
    void PreOrder(Tree T){
        if(T){
            printf("%d ",T->data);
            PreOrder(T->lchild);
            PreOrder(T->rchild);
        }
    }
    
    
    void OrderTree(Tree T,int n){    //二叉排序树的插入
        while (T){
            if((T)->data==n) return;
            else if(((T)->data<n) && (T)->rchild){
                T=(T)->rchild;
            }
            else if(((T)->data>n) && (T)->lchild){
                T=(T)->lchild;
            } else break;
        }
        Tree p=(Tree)malloc(sizeof(Tree));
        if(n>(T)->data){
            (T)->rchild=p;
        }
        if(n<(T)->data){
            (T)->lchild=p;
        }
        p->data=n;
        p->lchild=NULL;
        p->rchild=NULL;
    }
    
    int main(){
        Tree T=NULL;
        CreateTree(&T);
        PreOrder(T);
        OrderTree(T,8);
        printf("\n");
        PreOrder(T);
    }
    

  1. 题目:二叉排序树,也称为二叉查找树。可以是一棵空树,也可以是一棵具有如下特性的非空二叉树:1.若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;2.若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;3.左、右子树本身也是一颗二叉排序树。现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

    输入:输入包含多组测试数据,每组测试数据两行。第一行,一个数字N(N<=100),表示待插入的节点数。第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。

    输出:输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct TreeNode{
        int data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    int l=0;
    void OrderTree(Tree T,int *orderstr){    //二叉排序树的插入
        while(l<5){
            if(!T){
                printf("-1\n");
                T=(Tree)malloc(sizeof(Tree));
                T->data=orderstr[l];
                T->lchild=NULL;
                T->rchild=NULL;
                l++;
            }
            while (T){
                if((T)->data==orderstr[l]) return;
                else if(((T)->data<orderstr[l]) && (T)->rchild){
                    T=(T)->rchild;
                }
                else if(((T)->data>orderstr[l]) && (T)->lchild){
                    T=(T)->lchild;
                } else break;
            }
            if (T){
                Tree p=(Tree)malloc(sizeof(Tree));
                if(orderstr[l]>(T)->data){
                    (T)->rchild=p;
                }
                if(orderstr[l]<(T)->data){
                    (T)->lchild=p;
                }
                printf("%d\n",T->data);
                p->data=orderstr[l];
                p->lchild=NULL;
                p->rchild=NULL;
                l++;
            }
        }
    }
    
    int main(){
        Tree T=NULL;
        int orderstr[20];
        int N;
        scanf("%d\n",&N);
        for (int i = 0; i <N ; ++i) {
            scanf("%d",&orderstr[i]);
        }
        OrderTree(T,orderstr);
    }
    

  1. 题目:判断两序列是否为同一二叉搜索树序列

    输入:开始一个数n,(1<=n<=20)表示有n个需要判断,n=0的时候输入结束。接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一棵二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
    输出:如果序列相同则输出YES,否则输出NO

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct TreeNode{
        char data;
        struct TreeNode *lchild,*rchild;
    }*Tree;
    
    int o=0;
    void PreOrder(Tree T,char *str){
        if(T){
            str[o++]=T->data;
            PreOrder(T->lchild,str);
            PreOrder(T->rchild,str);
        }
    }
    int o1=0;
    void PreOrder1(Tree T,char *str){
        if(T){
            str[o1++]=T->data;
            PreOrder1(T->lchild,str);
            PreOrder1(T->rchild,str);
        }
    }
    
    int p=0;
    void InOrder(Tree T,char *str){
        if(T){
            InOrder(T->lchild,str);
            str[p++]=T->data;
            InOrder(T->rchild,str);
        }
    }
    int p1=0;
    void InOrder1(Tree T,char *str){
    
        if(T){
            InOrder1(T->lchild,str);
            str[p1++]=T->data;
            InOrder1(T->rchild,str);
        }
    }
    
    void OrderTree(Tree *T,char *orderstr,int m){    //二叉排序树的插入
        int l=0;
        while(l<m){
            if(!*T){
                *T=(Tree)malloc(sizeof(Tree));
                (*T)->data=orderstr[l];
                (*T)->lchild=NULL;
                (*T)->rchild=NULL;
                l++;
            }
            Tree temp=*T;
            while (temp){
                if((temp)->data==orderstr[l]) return;
                else if(((temp)->data<orderstr[l]) && (temp)->rchild){
                    temp=(temp)->rchild;
                }
                else if(((temp)->data>orderstr[l]) && (temp)->lchild){
                    temp=(temp)->lchild;
                } else break;
            }
            if (temp){
                Tree p=(Tree)malloc(sizeof(Tree));
                if(orderstr[l]>(temp)->data){
                    (temp)->rchild=p;
                }
                if(orderstr[l]<(temp)->data){
                    (temp)->lchild=p;
                }
                (p)->data=orderstr[l];
                (p)->lchild=NULL;
                (p)->rchild=NULL;
                l++;
            }
        }
    }
    
    int main(){
        Tree T=NULL;
        Tree T1=NULL;
        char orderstr[10];
        char orderstr1[10];
        char str[10];
        char str1[10];
        char Str[10];
        char Str1[10];
        int n,j;
        scanf("%d\n",&n);
        scanf("%s\n",orderstr);
        int m=strlen(orderstr);
        OrderTree(&T,orderstr,m);
        PreOrder(T,str);
        InOrder(T,Str);
        for (int i = 0; i <n ; i++) {
            scanf("%s\n",orderstr1);
            OrderTree(&T1,orderstr1,m);
            PreOrder1(T1,str1);
            InOrder1(T1,Str1);
            for (j = 0; j <m ; ++j) {
                if(str[j]!=str1[j] && Str[j]!=Str1[j]){
                    printf("NO");
                    break;
                }
            }
            if(j==6) printf("YES");
        }
    }
    

  1. 题目:一个复数(x+iy)集合,两种操作作用在该集合上:1、Pop表示读出集合中复数模值最大的那个复数,如集合为空输出empty,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib指令(a, b表示实部和虚部),将a+ib加入到集合中,输出集合的大小SIZE;—最开始要读入一个int n,表示接下来的n行每一行都是一条命令。

    #include <stdio.h>
    #include <string.h>
    
    typedef struct{
        int real;
        int vir;
    }Complex;
    
    int top=1;
    int rear=1;
    void Pop(Complex *arr){
        if(top==rear) printf("empty\n");
        else{
            printf("%d+i%d\n",arr[top].real,arr[top].vir);
            top++;
            printf("SIZE=%d\n",rear-top);
        }
    }
    
    void Insert(Complex *arr,int m,int n){
        arr[rear].real=m;
        arr[rear].vir=n;
        rear++;
        printf("SIZE=%d\n",rear-top);
    }
    
    void HeapAdjust(Complex *arr){
        int n=rear-top;
        for (int i = n; i >=1 ; i=i/2) {
            if((arr[i].real*arr[i].real + arr[i].vir*arr[i].vir) > (arr[2*i].real*arr[2*i].real + arr[2*i].vir*arr[2*i].vir) &&
              (arr[i].real*arr[i].real + arr[i].vir*arr[i].vir) > (arr[2*i+1].real*arr[2*i+1].real + arr[2*i+1].vir*arr[2*i+1].vir))
                continue;
            else{
                if((arr[2*i].real*arr[2*i].real + arr[2*i].vir*arr[2*i].vir) >
                (arr[2*i+1].real*arr[2*i+1].real + arr[2*i+1].vir*arr[2*i+1].vir)){
                    arr[0].real=arr[2*i].real;
                    arr[0].vir=arr[2*i].vir;
                    arr[2*i].real=arr[i].real;
                    arr[2*i].vir=arr[i].vir;
                    arr[i].real=arr[0].real;
                    arr[i].vir=arr[0].vir;
                } else{
                    arr[0].real=arr[2*i+1].real;
                    arr[0].vir=arr[2*i+1].vir;
                    arr[2*i+1].real=arr[i].real;
                    arr[2*i+1].vir=arr[i].vir;
                    arr[i].real=arr[0].real;
                    arr[i].vir=arr[0].vir;
                }
            }
        }
    }
    
    int main(){
        Complex arr[20];
        int n,x,y;
        char ch[10];
        scanf("%d\n",&n);
        for (int i = 0; i <n ; ++i) {
            scanf("%s",ch);
            if(strcmp(ch,"Pop")==0) {
                Pop(arr);
                HeapAdjust(arr);
            }
            if(strcmp(ch,"Insert")==0){
                scanf(" %d+i%d\n",&x,&y);
                Insert(arr,x,y);
                HeapAdjust(arr);
            }
        }
    }
    


posted @ 2023-01-12 22:50  原语  阅读(63)  评论(0编辑  收藏  举报