练习题总览
- 第一部分
- 韩信点兵
- 兰州烧饼
- 进制转换
- 第几天?
- 成绩转换
- 第二部分
- 求实数的绝对值。
- 计算球体积
- 两点距离
- 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码从小到大的顺序输出这三个字符。
第一行输入一个数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个整数中取最小数和最大数的程序
输入只有一组测试数据,为五个不大于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;
- }