2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言编程超全练习题(一)

时间:03-29来源:作者:点击数:69

练习题总览

  • 第一部分
  • 韩信点兵
  • 兰州烧饼
  • 进制转换
  • 第几天?
  • 成绩转换
  • 第二部分
  • 求实数的绝对值。
  • 计算球体积
  • 两点距离
  • ASCII码排序
  • 数值统计
  • 第三部分
  • 最小公倍数
  • 公约数和公倍数
  • 5个数求最值
  • 素数筛子算法
  • 分数加减法
  • 第四部分
  • 第二小整数
  • 奇偶数分离
  • 奇偶位互换
  • 统计硬币
  • 汉字统计
  • 第五部分
  • 偶数求和
  • 杨辉三角
  • 统计字符
  • 完数
  • 素数回文
  • 第六部分
  • 快速排序
  • 开门人和关门人
  • 鸡兔同笼
  • 日期计算
  • 开灯问题
  • 第七部分
  • 字符串替换
  • 字母统计
  • 字符串逆序输出
  • 交换输出
  • 比较字母大小
  • 第八部分
  • 猴子吃桃问题
  • 九九乘法表
  • 16进制的简单运算
  • 三角形面积
  • 平方和与立方和
  • 第九部分
  • 水仙花数
  • 多项式求和
  • 绝对值排序
  • 首字母变大写
  • a/b + c/d

第一部分

韩信点兵

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
  • 输入

输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

  • 输出

输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89

  • #include <stdio.h>
  • int main(){
  • int a;
  • int b;
  • int c;
  • int i;
  • scanf("%d%d%d",&a,&b,&c);
  • for(i=10;i<=100;i++){
  • if(i%3==a && i%5==b && i%7==c){
  • printf("%d\n",i);
  • break;
  • }
  • }
  • if(i==101)
  • printf("No answer\n");
  • return 0;
  • }

兰州烧饼

烧饼有两面,要做好一个兰州烧饼,要两面都弄热。当然,一次只能弄一个的话,效率就太低了。有这么一个大平底锅,一次可以同时放入k个兰州烧饼,一分钟能做好一面。而现在有n个兰州烧饼,至少需要多少分钟才能全部做好呢?
  • 输入

依次输入n和k,中间以空格分隔,其中1 <= k,n <= 100000

  • 输出

输出全部做好至少需要的分钟数

  • 提示

如样例,三个兰州烧饼编号a,b,c,首先a和b,然后a和c,最后b和c,3分钟完成

  • #include <stdio.h>
  • int main(){
  • int n;
  • int k;
  • int total;
  • int result;
  • while(scanf("%d%d",&n,&k)!=EOF){
  • total=n*2;
  • if(total<=k){
  • printf("2\n");
  • continue;
  • }
  • result=total/k;
  • if(total%k!=0)
  • result++;
  • printf("%d\n",result);
  • }
  • return 0;
  • }

错误代码(2020年4月25日22:15:04)

进制转换

输入一个十进制数N,将它转换成R进制数输出。
  • 输入

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

  • 输出

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

  • #include <stdio.h>
  • int main(){
  • int number;
  • int system;
  • char s[50];
  • int i;
  • int length;
  • int flag;
  • while((scanf("%d%d",&number,&system))!=EOF){
  • i=0;
  • flag=0;
  • if(number<0){
  • number=-number;
  • flag=1;
  • }
  • while(number){
  • if(number%system<=9){
  • s[i]=(number%system)+'0';
  • }
  • else if(number%system==10)
  • s[i]='A';
  • else if(number%system==11)
  • s[i]='B';
  • else if(number%system==12)
  • s[i]='C';
  • else if(number%system==13)
  • s[i]='D';
  • else if(number%system==14)
  • s[i]='E';
  • else if(number%system==15)
  • s[i]='F';
  • number/=system;
  • i++;
  • }
  • length=i;
  • if(flag==1)
  • printf("-");
  • for(i=length-1;i>=0;i--)
  • printf("%c",s[i]);
  • printf("\n");
  • }
  • return 0;
  • }

第几天?

给定一个日期,输出这个日期是该年的第几天。
  • 输入

输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。

  • 输出

对于每组输入数据,输出一行,表示该日期是该年的第几天。

  • #include <stdio.h>
  • int main(){
  • int a;
  • int b;
  • int c;
  • int i;
  • int day[13];
  • int sum;
  • day[1]=31;
  • day[2]=28;
  • day[3]=31;
  • day[4]=30;
  • day[5]=31;
  • day[6]=30;
  • day[7]=31;
  • day[8]=31;
  • day[9]=30;
  • day[10]=31;
  • day[11]=30;
  • day[12]=31;
  • while((scanf("%d/%d/%d",&a,&b,&c))!=EOF){
  • sum=0;
  • for(i=1;i<=b-1;i++)
  • sum+=day[i];
  • sum+=c;
  • if((a%400==0 || (a%4==0 && a%100!=0)) && b>=3)
  • sum++;
  • printf("%d\n",sum);
  • }
  • return 0;
  • }

成绩转换

输入一个百分制的成绩M,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
  • #include <stdio.h>
  • int main(){
  • int T;
  • int n;
  • char c;
  • scanf("%d",&T);
  • while(T--){
  • scanf("%d",&n);
  • if(n>=90)
  • c='A';
  • else if(n>=80)
  • c='B';
  • else if(n>=70)
  • c='C';
  • else if(n>=60)
  • c='D';
  • else
  • c='E';
  • printf("%c\n",c);
  • }
  • return 0;
  • }

第二部分

求实数的绝对值。

求实数的绝对值。
  • 输入

输入数据有多组,每组占一行,每行包含一个实数。

  • 输出

对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。

  • #include <stdio.h>
  • int main(){
  • double number;
  • while((scanf("%lf",&number)!=EOF)){
  • if(number<0)
  • number=-number;
  • printf("%.2lf\n",number);
  • }
  • return 0;
  • }

计算球体积

根据输入的半径值,计算球的体积。
  • 输入

输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。

  • 输出

输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。

  • #include <stdio.h>
  • #define PI 3.1415927
  • int main(){
  • double r;
  • double result;
  • while((scanf("%lf",&r))!=EOF){
  • result=4.0*PI*r*r*r/3.0;
  • printf("%.3lf\n",result);
  • }
  • return 0;
  • }

两点距离

输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),计算并输出两点间的距离。
  • 输入

第一行输入一个整数n(0<n<=1000),表示有n组测试数据;随后每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。

  • 输出

对于每组输入数据,输出一行,结果保留两位小数。

  • #include <stdio.h>
  • #include <math.h>
  • int main(){
  • int T;
  • double a;
  • double b;
  • double c;
  • double d;
  • double distance;
  • scanf("%d",&T);
  • while(T--){
  • scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  • distance=sqrt((a-c)*(a-c)+(b-d)*(b-d));
  • printf("%.2lf\n",distance);
  • }
  • return 0;
  • }

ASCII码排序

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
  • 输入

第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。

  • 输出

对于每组输入数据,输出一行,字符中间用一个空格分开。

  • #include <stdio.h>
  • int main(){
  • char a;
  • char b;
  • char c;
  • char temp;
  • int T;
  • scanf("%d",&T);
  • getchar();
  • while(T--){
  • scanf("%c%c%c",&a,&b,&c);
  • getchar();
  • if(a>b){
  • temp=a;
  • a=b;
  • b=temp;
  • }
  • if(a>c){
  • temp=a;
  • a=c;
  • c=temp;
  • }
  • if(b>c){
  • temp=b;
  • b=c;
  • c=temp;
  • }
  • printf("%c %c %c\n",a,b,c);
  • }
  • return 0;
  • }

数值统计

统计给定的n个数中,负数、零和正数的个数。
  • 输入

输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。

  • 输出

对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。

  • #include <stdio.h>
  • int main(){
  • int n;
  • int i;
  • int a;
  • int b;
  • int c;
  • double number;
  • while(1){
  • a=0;
  • b=0;
  • c=0;
  • scanf("%d",&n);
  • if(n==0)
  • break;
  • for(i=0;i<n;i++){
  • scanf("%lf",&number);
  • if(number<0)
  • a++;
  • else if(number==0)
  • b++;
  • else
  • c++;
  • }
  • printf("%d %d %d\n",a,b,c);
  • }
  • return 0;
  • }

第三部分

最小公倍数

给定两个正整数,计算这两个数的最小公倍数。
  • 输入

输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.

  • 输出

对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

  • #include <stdio.h>
  • int get_LCM(int a,int b);
  • int main(){
  • int a;
  • int b;
  • while((scanf("%d%d",&a,&b))!=EOF){
  • printf("%d\n",get_LCM(a,b));
  • }
  • return 0;
  • }
  • int get_LCM(int a,int b){
  • int temp;
  • int remainder;
  • int A;
  • int B;
  • A=a;
  • B=b;
  • if(a<b){
  • temp=a;
  • a=b;
  • b=temp;
  • }
  • while(a%b){
  • remainder=a%b;
  • a=b;
  • b=remainder;
  • }
  • return A*B/b;
  • }

公约数和公倍数

小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
  • 输入

第一行输入一个整数n(0<n<=10000),表示有n组测试数据;随后的n行输入两个整数i,j(0<i,j<=32767)。

  • 输出

输出每组测试数据的最大公约数和最小公倍数

  • #include <stdio.h>
  • int main(){
  • int a;
  • int b;
  • int temp;
  • int T;
  • int a_save;
  • int b_save;
  • scanf("%d",&T);
  • while(T--){
  • scanf("%d%d",&a,&b);
  • if(a<b){
  • temp=a;
  • a=b;
  • b=temp;
  • }
  • a_save=a;
  • b_save=b;
  • while(a%b!=0){
  • temp=a%b;
  • a=b;
  • b=temp;
  • }
  • printf("%d %d\n",b,a_save*b_save/b);
  • }
  • return 0;
  • }

5个数求最值

设计一个从5个整数中取最小数和最大数的程序
  • 输入

输入只有一组测试数据,为五个不大于1万的正整数

  • 输出

输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。

  • #include <stdio.h>
  • int main(){
  • int number;
  • int min;
  • int max;
  • int i;
  • for(i=0;i<5;i++){
  • scanf("%d",&number);
  • if(i==0){
  • min=number;
  • max=number;
  • continue;
  • }
  • if(number<min)
  • min=number;
  • if(number>max)
  • max=number;
  • }
  • printf("%d %d\n",min,max);
  • return 0;
  • }

素数筛子算法

现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
  • 输入

给出一个正整数数N(N<=2000000)、但N为0时结束程序。、测试数据不超过100组

  • 输出

将2~N范围内所有的素数输出。两个数之间用空格隔开

  • #include <stdio.h>
  • #include <string.h>
  • #include <math.h>
  • #define N 2000001
  • int main(){
  • int i;
  • int j;
  • char flag[N];
  • memset(flag,'0',N);
  • flag[0]='1';
  • flag[1]='1';
  • for(i=2;i<=sqrt(N);i++){
  • if(flag[i]=='0'){
  • for(j=i*i;j<N;j+=i){
  • flag[j]='1';
  • }
  • }
  • }
  • int number;
  • while(1){
  • scanf("%d",&number);
  • if(number==0)
  • break;
  • for(i=2;i<=number;i++){
  • if(flag[i]=='0')
  • printf("%d ",i);
  • }
  • printf("\n");
  • }
  • return 0;
  • }

分数加减法

编写一个C程序,实现两个分数的加减法
  • 输入

输入包含多行数据

每行数据是一个字符串,格式是"a/boc/d"。

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

数据以EOF结束

输入数据保证合法

  • 输出

对于输入数据的每一行输出两个分数的运算结果。 注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

  • #include <stdio.h>
  • int gcd(int a,int b);
  • int main(){
  • int a;
  • int b;
  • int c;
  • int d;
  • char sign;
  • int fenmu;
  • int fenzi;
  • char temp;
  • while(scanf("%d/%d%c%d/%d",&a,&b,&sign,&c,&d)!=EOF){
  • fenmu=b*d/gcd(b,d);
  • if(sign=='+')
  • fenzi=a*fenmu/b+c*fenmu/d;
  • else
  • fenzi=a*fenmu/b-c*fenmu/d;
  • if(fenzi==0){ //分子为0直接输出0
  • printf("0\n");
  • continue;
  • }
  • temp='+';
  • if(fenzi<0){ //当为负数时,化为正数,标记负号
  • fenzi=-fenzi;
  • temp='-';
  • }
  • if(temp=='-') //有负号时输出负号
  • printf("-");
  • if(fenzi%fenmu==0) //如果整除时直接输出商
  • printf("%d\n",fenzi/fenmu);
  • else //不整除时以分数的形式输出
  • printf("%d/%d\n",fenzi/gcd(fenmu,fenzi),fenmu/gcd(fenmu,fenzi));
  • }
  • return 0;
  • }
  • int gcd(int a,int b){
  • int temp;
  • if(a<b){
  • temp=a;
  • a=b;
  • b=temp;
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门