C语言例题
C语言例题
-
题目:一个整数,它加上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; }
-
题目:企业发放的奖金根据利润提成。
- 利润(工)低于或等于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、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; }
-
题目:输入某年某月某日,判断这一天是这一年的第几天?
#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
-
题目:输入三个整数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; }
-
题目:用*号输出字母C的图案。
#include <stdio.h> int main() { printf("*********\n"); printf("*\n"); printf("*\n"); printf("*\n"); printf("*\n"); printf("*********"); return 0; }
-
题目:输出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; }
-
题目:古典问题(兔子生惠)∶有一对兔子,从出生后第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; }
-
题目:判断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;
-
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: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; }
-
题目:将一个正整数分解质因数。例如:输入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; }
-
题目:利用条件运算符的嵌套来完成此题:学习成绩>=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; }
-
题目:输入两个正整数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; }
-
题目:输入一行字符,分列统计出其中英文字母、空格、数字和其它字符的个数。
#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; }
-
题目:求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; }
-
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如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; }
-
题目:一球从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; }
-
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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; }
-
题目:打印出菱形
#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; }
-
题目:有一分数序列: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+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; }
-
题目:利用递归方法求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; }
-
题目:利用递归函数调用方式,将所输入的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; }
-
题目:有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; }
-
题目:给一个不多于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; }
-
题目:一个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; }
-
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#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);(清空输入缓冲区) 否则语句无效
-
题目:删除一个字符串中的指定字母,如:字符串"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; }
-
题目:判断一个数字是否为质数。
#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; }
-
题目:字符串反转,如将字符串"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; }
-
题目:求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; }
-
题目:求一个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; }
-
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
#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; }
-
题目:将一个数组逆序输出
#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; }
-
题目:输出杨辉三角
#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; }
-
题目:用函数交换两个变量的值
#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; }
-
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
#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; }
-
题目:有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; }
-
题目:有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; }
-
题目:写一个函数,求一个字符串的长度,在 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; }
-
题目:编写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函数进行输出
-
题目: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()严格对应
-
题目:输入一个整数,并将其反转后输出。
#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); }
-
题目:编写一个函数,输入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); }
-
指向指针的指针(二级指针)
#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 }
-
二维指针+数组
#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)); }
-
二维指针+字符串
#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); } }
-
结构体+指针-找年龄最大的人
指针可以指向任意内存 为了保证指针安全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); }
-
字符串排序
必须用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]); } }
-
题目: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); } } }
-
题目:八进制转换为十进制
#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); }
-
题目:求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); } } }
-
题目:任何—个大于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"); } }
-
题目:判断一个素数能被几个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); } }
-
题目:两个字符串连接程序
#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); }
-
题目:结构体变量传递
#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 }
-
题目:读取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"); } }
-
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上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); }
-
题目:猜数游戏。没猜中就给一句提示,大了还是小了;猜中了,问要不要继续玩;不玩拉倒。
#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);
-
题目:计算字符串中出现子串的个数
#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); }
-
题目:
#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); }
-
题目:设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); } }
-
题目:设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); } }
-
题目:打印所有不超过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); } }
-
题目:输入一个高度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"); } } }
-
题目:输入是一个三元组,分别是:外筐尺寸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"); } }
-
题目:输入年、月、日,计算该天是本年的第几天
#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); }
-
题目:给出年分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); }
-
题目:对输入的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]); } }
-
题目:输入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]); } } }
-
题目:用一维数组存储学号和成绩,然后按成绩排序输出。输入:输入的第一行中包括一个整数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); } }
-
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入者排列在前的规则处理。输入多行,首先物入要排序的人的个数,然后输入排序方法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); } } }
-
题目: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"); }
-
题目:有一条长度为整数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); }
-
题目:按照手机键盘输入字母的方式,计算所花费的时间。例如,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); }
-
题目:输入一个数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); }
-
题目:输入数组长度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"); } } }
-
题目:一个数如果恰好等于它的各个因子(该数本身除外)之和,如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]); } } }
-
题目: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,则代表有动物进入收容所。第二个元素为动物的编号,正数代表狗,负数代表猫。若第一个元素为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; } } } } } }
-
题目:在某个字符串(长度不超过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("$"); } }
-
题目:读入一个只包含+,-*,/的非负整数计算表达式,计算该表达式的值。输入:测试输入包含若干测试用例,每个测试用例占一行,每行不超过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); } }
-
题目:约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,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)); }
-
题目:创建并且遍历一个二叉树(先序)
二叉树的创建一定要使用二级指针
#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); }
-
题目:二叉树的层次遍历
#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); }
-
题目:根据先序序列和中序序列构建二叉树,并用后序遍历输出
#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); }
-
题目:根据带‘#’(空叶子结点)的先序序列重建二叉树
#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); }
-
题目:二叉排序树的插入
#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.若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;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); }
-
题目:判断两序列是否为同一二叉搜索树序列
输入:开始一个数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"); } }
-
题目:一个复数(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); } } }