如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int x;
8 scanf("%d",&x);
9 int inch = 0.394*x;
10 printf("%d %d", inch/12, inch%12);
11 return 0;
12 }
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int time, minute;
8 scanf("%d%d",& time,&minute);
9 int t = time/100*60 + time%100 + minute;
10 printf("%d", t/60*100 + t%60);
11 return 0;
12 }
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int x;
8 scanf("%d",&x);
9 int sum = 0;
10 while(x)
11 {
12 sum = sum*10 + x%10;
13 x /= 10;
14 }
15 printf("%d", sum);
16 return 0;
17 }
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int x;
8 scanf("%d",&x);
9 printf("%d", x/16*10+x%16);
10 return 0;
11 }
本题要求编写程序,按照规定格式输出表格。
输入格式:
本题目没有输入。
输出格式:
要求严格按照给出的格式输出下列表格:
------------------------------------
Province Area(km2) Pop.(10K)
------------------------------------
Anhui 139600.00 6461.00
Beijing 16410.54 1180.70
Chongqing 82400.00 3144.23
Shanghai 6340.50 1360.26
Zhejiang 101800.00 4894.00
------------------------------------
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 printf("------------------------------------\n");
8 printf("Province Area(km2) Pop.(10K)\n");
9 printf("------------------------------------\n");
10 printf("Anhui 139600.00 6461.00\n");
11 printf("Beijing 16410.54 1180.70\n");
12 printf("Chongqing 82400.00 3144.23\n");
13 printf("Shanghai 6340.50 1360.26\n");
14 printf("Zhejiang 101800.00 4894.00\n");
15 printf("------------------------------------\n");
16 return 0;
17 }
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 float f1,f2;
8 int i;
9 char c;
10 scanf("%f%d%*c%c%f",&f1,&i,&c,&f2);
11 printf("%c %i %.2f %.2f",c,i,f1,f2);
12
13 return 0;
14 }
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式:
输入在一行中给出带有中间的:
符号(半角的冒号)的24小时制的时间,如12:34
表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6
表示5点零6分。
提示:在scanf
的格式字符串中加入:
,让scanf
来处理这个冒号。
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM
或表示下午的字符串PM
。如5:6 PM
表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00
就是12小时制的12:0 PM
;而0点被认为是第二天的时间,所以是0:0 AM
。
输入样例:
21:11
输出样例:
9:11 PM
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int h,m;
8 scanf("%d:%d",&h,&m);
9 if(h<12)
10 printf("%d:%d AM",h,m);
11 else if(h==12)
12 printf("%d:%d PM",h,m);
13 else
14 printf("%d:%d PM",h-12,m);
15
16 return 0;
17 }
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式:
在一行中输出测速仪显示结果,格式为:Speed: V - S
,其中V
是车速,S
或者是Speeding
、或者是OK
。
输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int speed;
8 scanf("%d",&speed);
9 if(speed<=60)
10 printf("Speed: %d - OK",speed);
11 else
12 printf("Speed: %d - Speeding",speed);
13
14 return 0;
15 }
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:
在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int A,B,C;
8 scanf("%d%d%d",&A,&B,&C);
9 if(A==B)
10 printf("C");
11 else{
12 if(A==C)
13 printf("B");
14 else
15 printf("A");
16 }
17
18 return 0;
19 }
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式:
在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int y,h;
8 scanf("%d%d",&y,&h);
9
10 int hs;
11 if(y>=5)
12 hs = 50;
13 else
14 hs = 30;
15
16 double ws;
17 if(h<40)
18 ws = hs*h;
19 else
20 ws = hs*(40+(h-40)*1.5);
21
22 printf("%.2f",ws);
23
24 return 0;
25 }
7-11 分段计算居民水费
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y = 4x/3;超过后,y = 2.5x - 17.5。请编写程序实现水费的计算。
输入格式:
输入在一行中给出非负实数x。
输出格式:
在一行输出应交的水费,精确到小数点后2位。
输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int x;
8 scanf("%d",&x);
9
10 double y;
11 if(x<15)
12 y = 4*x/3.0;
13 else
14 y = 2.5*x - 17.5;
15
16 printf("%.2f",y);
17
18 return 0;
19 }
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+
、-
、*
、/
、%
时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR
。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main()
6 {
7 int a,b;
8 char c;
9 scanf("%d%*c%c%d",&a,&c,&b);
10
11 switch(c)
12 {
13 case '+':
14 printf("%d",a+b);
15 break;
16 case '-':
17 printf("%d",a-b);
18 break;
19 case '*':
20 printf("%d",a*b);
21 break;
22 case '/':
23 printf("%d",a/b);
24 break;
25 case '%':
26 printf("%d",a%b);
27 break;
28 default:
29 printf("ERROR");
30 }
31
32 return 0;
33 }
股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。
输入格式:
输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。
输出格式:
在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型
。如果两种影线都有,则输出with Lower Shadow and Upper Shadow
。
输入样例1:
5.110 5.250 5.100 5.105
输出样例1:
BW-Solid with Lower Shadow and Upper Shadow
输入样例2:
5.110 5.110 5.110 5.110
输出样例2:
R-Cross
输入样例3:
5.110 5.125 5.112 5.126
输出样例3:
R-Hollow
1 #include <stdio.h>
2 int main()
3 {
4 double open,high,low,close;
5 scanf("%lf%lf%lf%lf",&open,&high,&low,&close);
6 if(close<open) printf("BW-Solid");
7 else if(close>open) printf("R-Hollow");
8 else printf("R-Cross");
9
10 if(low<open&&low<close&&high>open&&high>close)
11 printf(" with Lower Shadow and Upper Shadow");
12 else if(low<open&&low<close)
13 printf(" with Lower Shadow");
14 else if(high>open&&high>close)
15 printf(" with Upper Shadow");
16 return 0;
17 }
7-14 求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
1 #include <stdio.h>
2 int main()
3 {
4 int a,b,sum=0,count=0;
5 scanf("%d%d",&a,&b);
6 for(int i=a; i<=b; ++i){
7 sum += i;
8 printf("%5d",i);
9 count++;
10 if(count%5==0)
11 printf("\n");
12 }
13 if(count!=5)
14 printf("\n");
15 printf("Sum = %d",sum);
16 return 0;
17 }
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
π /2 = 1+ 1/3 + 2! / (3×5) + 3! / (3×5×7) + ⋯ + n! / (3×5×7×⋯×(2n+1)) + ⋯
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
1 #include <stdio.h>
2 int main()
3 {
4 long long i=1,j=3;
5 double x, num = 1, den = 3, value = num/den, sum = 1+1.0/3;
6 scanf("%lf",&x);
7 while(value>x){
8 num *= ++i;
9 den *= (j+=2);
10 value = (double)num/den;
11 sum += value;
12 }
13 printf("%.6f",sum*2);
14 return 0;
15 }
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
1 #include <stdio.h>
2 int main()
3 {
4 int a=2,count=0;
5 scanf("%d",&a);
6 for(int i=a; i<=a+3; i++)
7 {
8 for(int j=a; j<=a+3; j++){
9 for(int k=a; k<=a+3; k++)
10 if(i!=j&&i!=k&&j!=k){
11 if(count%6)printf(" ");
12 printf("%d%d%d",i,j,k);
13 count++;
14 if(count%6==0)
15 printf("\n");
16 }
17 }
18 }
19 return 0;
20 }
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
1 /*
2 12 3 1
3 */
4 #include <stdio.h>
5 int main()
6 {
7 int n,u,d,t=0;
8 scanf("%d%d%d",&n,&u,&d);
9 while(n)
10 {
11 n -= u;
12 t++;
13 if(n<=0) break;
14 n += d;
15 t++;
16 }
17 printf("%d",t);
18 return 0;
19 }
二分法求函数根的原理为:如果连续函数(在区间[的两个端点取值异号,即(,则它在这个区间内至少存在1个根r,即(。
二分法的步骤为:
- 检查区间长度,如果小于给定阈值,则停止,输出区间中点(;否则
- 如果(,则计算中点的值(;
- 如果(正好为0,则(就是要求的根;否则
- 如果(与(同号,则说明根在区间[,令),重复循环;
- 如果(与(同号,则说明根在区间[,令),重复循环。
本题目要求编写程序,计算给定3阶多项式(在给定区间[内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
1 #include<stdio.h>
2 #include<math.h>
3 #define EPS 1e-6
4 float Root(float x,float a3,float a2,float a1,float a0)
5 {
6 return a3*x*x*x + a2*x*x + a1*x + a0;
7 }
8 int main()
9 {
10 float a0,a1,a2,a3;
11 float min,max,mid;
12 scanf("%f%f%f%f",&a3,&a2,&a1,&a0);
13 scanf("%f%f",&min,&max);
14 do{
15 mid=(max+min)/2.0;
16 if(Root(mid,a3,a2,a1,a0)*Root(min,a3,a2,a1,a0)>0) min = mid;
17 if(Root(mid,a3,a2,a1,a0)*Root(max,a3,a2,a1,a0)>0) max = mid;
18 }while(fabs( Root(mid,a3,a2,a1,a0)) > EPS);
19 printf("%.2f\n",mid);
20 return 0;
21 }
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2元2分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f
输出该支票的原始面额。如果无解,则输出No Solution
。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
1 #include <stdio.h>
2 int main()
3 {
4 int n=23,flag=0;
5 scanf("%d",&n);
6
7 for(int y=0; y<=100; ++y){
8 for(int f=0; f<=100; ++f){
9 if(f*100+y - n == 2*y*100+2*f){
10 flag=1;
11 printf("%d.%d\n",y,f);
12 }
13 }
14 }
15
16 if(!flag)
17 printf("No Solution");
18 return 0;
19 }
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N
,输出从1*1
到N*N
的部分口诀表。
输入格式:
输入在一行中给出一个正整数N
(1≤N
≤9)。
输出格式:
输出下三角N*N
部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1 #include <stdio.h>
2 int main()
3 {
4 int n;
5 scanf("%d",&n);
6
7 for(int i=1; i<=n; ++i){
8 for(int j=1; j<=i; ++j){
9 printf("%d*%d=%-4d",j,i,i*j);
10 }
11 printf("\n");
12 }
13 return 0;
14 }
本题要求对任意给定的正整数N,求方程X^2+Y^2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X^2+Y^2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution
。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution
1 #include<stdio.h>
2 int main()
3 {
4 int N = 884, flag = 0;
5 scanf("%d",&N);
6 for(int x=1; x<=N-x; ++x){
7 for(int y=1; y<=N-x*x; ++y){
8 if(x<y && x*x+y*y==N){
9 printf("%d %d\n",x,y);
10 flag = 1;
11 }
12 }
13 }
14 if(!flag)
15 printf("No Solution");
16 return 0;
17 }
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
1 #include<stdio.h>
2 int main()
3 {
4 int time;
5 scanf("%d", &time);
6
7 int i, rest = 0, run = 0, disrab = 0, distur = 0;
8 for(i = 0; i<time; i++)
9 {
10 if(run == 0){
11 run = 10;/*兔子跑十分钟*/
12 if(disrab>distur){
13 rest = 30;/*超过了乌龟休息半小时*/
14 }
15 }
16
17 distur += 3;/*乌龟一分钟*/
18 if(rest == 0 ){
19 disrab += 9;/*兔子一分钟(十分钟之内)*/
20 run--;
21 }
22
23 if(rest>0){/*兔子休息(半小时之内)*/
24 rest--;
25 }
26 }
27
28 if(disrab<distur){
29 printf("@_@ %d",distur);
30 }
31 else if(disrab > distur){
32 printf("^_^ %d",disrab);
33 }
34 else{
35 printf("-_- %d",disrab);
36 }
37
38 return 0;
39 }
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
1 //813227345//6900//23108//100001//0
2 #include <stdio.h>
3 #include <string.h>
4 int main()
5 {
6 const char *num1 = "abcdefghij";
7 const char *num2 = "GSBQWSBQY";
8 char x[10] = "";
9 scanf("%s", x);
10
11 int start = 0;//字符串下标start
12 int end = strlen(x)-1;//字符串下标end
13 while(x[start])//当前字符
14 {
15 if(x[start]!='0'){//当前字符不为'0'
16 printf("%c",num1[x[start]-'0']);
17 if(end-start>=1)
18 printf("%c",num2[end-start]);
19 }
20 else{//当前字符为'0', 要么输出'a', 要么输出'W'
21 if(end-start==4) printf("%c",num2[end-start]); //且万位4,输出'W'
22 //且不到字符串尾部且下一个字符不是'0', 或字符串只一个'0'
23 else if( end > start && x[start+1]!='0' || !end )//输出'a'
24 printf("%c",num1[x[start]-'0']);
25 }
26 start++;
27 }
28 return 0;
29 }
分数可以表示为分子/分母
的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/
分隔,如:12/34
表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:在scanf
的格式字符串中加入/
,让scanf
来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母
的形式表示分数。如 5/6
表示6分之5。
输入样例:
66/120
输出样例:
11/20
1 #include <stdio.h>
2 int main()
3 {
4 int a,b;
5 scanf("%d/%d",&a,&b);
6 int t = a<b?a:b;
7 while(t)
8 {
9 if(a%t==0&&b%t==0)
10 break;
11 t--;
12 }
13 printf("%d/%d",a/t,b/t);
14 return 0;
15 }
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu
字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si 5: wu 6: liu 7: qi 8: ba 9: jiu
输入格式:
输入在一行中给出一个整数,如:1234
。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si
。
输入样例:
-600
输出样例:
fu liu ling ling
1 #include <stdio.h>
2 int main()
3 {
4 const char* num[10] =
5 {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
6 char s[256] = "";
7 scanf("%s",s);
8
9 int index=0, flag = 0;
10 while(s[index])
11 {
12 if(flag)
13 printf(" ");
14 if(s[index]=='-')
15 printf("%s","fu");
16 else
17 printf("%s",num[s[index]-'0']);
18 index++;
19 flag = 1;
20 }
21 return 0;
22 }
7-26 单词长度
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式:
输入在一行中给出一行文本,以.结束
提示:用scanf("%c",...);来读入一个字符,直到读到.为止。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4
1 #include <stdio.h>
2 int main()
3 {
4 char s[256] = "";
5 gets(s);
6 int i=0, count=0,flag=0;
7 while(s[i])
8 {
9 if(s[i++]!=' ' && s[i-1]!='.')
10 count++;
11 else{
12 if(!count)
13 continue;
14 if(flag)
15 printf(" ");
16 printf("%d",count);
17 count = 0;
18 flag = 1;
19 }
20 }
21 return 0;
22 }
7-27 冒泡法排序
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 1 3 4 5 6
1 #include <stdio.h>
2 int main()
3 {
4 int n,k;
5 int arr[256] = {0};
6 scanf("%d%d",&n,&k);
7 for(int i=0; i<n; ++i){
8 scanf("%d",&arr[i]);
9 }
10 for(int i=0; i<k; ++i){
11 for(int j=1; j<n-i; ++j){
12 if(arr[j-1]>arr[j]){
13 int t = arr[j-1];
14 arr[j-1] = arr[j];
15 arr[j] = t;
16 }
17 }
18 }
19 for(int i=0; i<n; ++i)
20 {
21 if(i) printf(" ");
22 printf("%d",arr[i]);
23 }
24 return 0;
25 }
7-28 猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
1 #include <stdio.h>
2 int main()
3 {
4 int arr[1000] = {0};
5 int n;
6 scanf("%d",&n);
7 int t = n, i=0;
8 int count = 0;
9 while(t>1)
10 {
11 if(i==n)
12 i = 0;
13 if(!arr[i])
14 count++;
15 if(count==3){
16 count=0;
17 arr[i] = 1;
18 t--;
19 }
20 i++;
21 }
22 for(int i=0; i<n; ++i)
23 if(!arr[i]) printf("%d",i+1);
24 return 0;
25 }
7-29 删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
1 /*
2 char * strcat ( char * destination, const char * source );
3 destination and source shall not overlap.
4 */
5 #include <stdio.h>
6 #include <string.h>
7 int main()
8 {
9 char s1[100] = "";
10 char s2[100] = "";
11 char t[100] = "";
12 gets(s1);
13 gets(s2);
14
15 char* p = NULL;
16 while(p = strstr(s1,s2))
17 {
18 *p = '\0';
19 strcpy(t,p+strlen(s2));
20 strcat(s1,t);
21 }
22 printf("%s",s1);
23 return 0;
24 }
7-30 字符串的冒泡排序
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出格式:
输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
输入样例:
6 2
best
cat
east
a
free
day
输出样例:
best
a
cat
day
east
free
1 #include <stdio.h>
2 #include <string.h>
3 #define N 256
4 int main()
5 {
6 int n,k;
7 char str[N][N] = {0};
8 scanf("%d%d",&n,&k);
9 for(int i=0; i<n; ++i){
10 scanf("%s",&str[i]);
11 }
12 for(int i=0; i<k; ++i){
13 for(int j=1; j<n-i; ++j){
14 if(strcmp(str[j-1],str[j])>0){
15 char t[N] = "";
16 strcpy(t,str[j-1]);
17 strcpy(str[j-1],str[j]);
18 strcpy(str[j],t);
19 }
20 }
21 }
22 for(int i=0; i<n; ++i)
23 printf("%s\n",str[i]);
24
25 return 0;
26 }
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
1 #include <stdio.h>
2 #include <string.h>
3 #define N 101
4 int main ()
5 {
6 char str[N] = "";
7 int n;
8 gets(str);
9 scanf("%d",&n);
10
11 int index = strlen(str)-1;
12 while(n--)
13 {
14 char ch = str[0];
15 for(int i=1; i<=index; ++i)
16 str[i-1] = str[i];
17 str[index] = ch;
18 }
19 puts(str);
20 return 0;
21 }
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
1 #include <stdio.h>
2 #include <string.h>
3 #define N 500001
4 int main ()
5 {
6 char str[N] = "";
7 gets(str);
8 int count=0,flag = 0;
9 char* p = str+strlen(str) - 1;
10
11 while(p>=str)/* Hello World Here I Come */
12 {
13 if(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z')
14 {
15 count++;
16 if(!(*(p-1)>='a'&&*(p-1)<='z'||*(p-1)>='A'&&*(p-1)<='Z')){
17 if(flag) printf(" ");
18 for(int i=0; i<count; ++i)
19 printf("%c",*(p+i));
20 count = 0;
21 flag = 1;
22 }
23 }
24 p--;
25 }
26 return 0;
27 }
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b
的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
1 #include <stdio.h>
2 int main ()
3 {
4 int a1,b1,a2,b2;
5 scanf("%d/%d%d/%d",&a1,&b1,&a2,&b2);
6
7 int a = a1*b2+a2*b1;
8 int b = b1*b2;
9 int t = a<b?a:b;
10 while(t)
11 {
12 if(a%t==0&&b%t==0)
13 break;
14 t--;
15 }
16 if(b/t==1)
17 printf("%d",a/t);
18 else
19 printf("%d/%d",a/t,b/t);
20 return 0;
21 }
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机
给出一条记录。其中姓名
是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd
的格式给出年月日;性别用M
表示“男”、F
表示“女”;固话
和手机
均为不超过15位的连续数字,前面有可能出现+
。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。
输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日
的格式输出该记录。若要查询的记录不存在,则输出Not Found
。
输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found
1 #include <stdio.h>
2 struct address{
3 char name[20];
4 char birthday[20];
5 char sex[20];
6 char tel[20];
7 char mobile[20];
8 };
9 int main ()
10 {
11 int n;
12 scanf("%d",&n);
13 struct address records[20];
14 for(int i=0; i<n; ++i)
15 {
16 scanf("%s%s%s%s%s",
17 records[i].name,
18 records[i].birthday,
19 records[i].sex,
20 records[i].tel,
21 records[i].mobile);
22 }
23 /*输出 */
24 int k,record;
25 scanf("%d",&k);
26 for(int i=0; i<k; ++i)
27 {
28 scanf("%d",&record);
29 if(record>=0 && record<n)
30 printf("%s %s %s %s %s\n",
31 records[record].name,
32 records[record].tel,
33 records[record].mobile,
34 records[record].sex,
35 records[record].birthday);
36 else
37 printf("Not Found\n");
38 }
39 return 0;
40 }
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …
的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b
的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
1 #include <stdio.h>
2 int reduce(int a,int b){
3 int r=a%b;
4 while(r!=0){
5 a=b;
6 b=r;
7 r=a%b;
8 }
9 return b;
10 }
11 int main ()
12 {
13 int n, a1=0, b1=1, a2, b2, t;
14 scanf("%d",&n);
15 for(int i=0; i<n; ++i){
16 scanf("%d/%d",&a2,&b2);
17 a1 = a1*b2+a2*b1;
18 b1 = b1*b2;
19 t = reduce(a1,b1);
20 a1 /= t;
21 b1 /= t;
22 }
23 t = reduce(a1,n*b1);
24 if(n*b1/t==1)
25 printf("%d",a1/t);
26 else
27 printf("%d/%d",a1/t,n*b1/t);
28 return 0;
29 }
本题要求编写程序,计算2个复数的和、差、积、商。
输入格式:
输入在一行中按照a1 b1 a2 b2
的格式给出2个复数C1=a1+b1i
和C2=a2+b2i
的实部和虚部。题目保证C2不为0。
输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果
的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
输入样例1:
2 3.08 -2.04 5.06
输出样例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
1 1 -1 -1.01
输出样例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0 (1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i (1.0+1.0i) * (-1.0-1.0i) = -2.0i (1.0+1.0i) / (-1.0-1.0i) = -1.0
1 #include <stdio.h>
2 #include <math.h>
3 #define eps 1e-1
4 double a1,b1,a2,b2,a,b;
5 void print(char op)
6 {
7 printf("(%.1f%+.1fi) %c (%.1f%+.1fi) = ",a1,b1,op,a2,b2);
8 if(fabs(a)<eps&&fabs(b)<eps) //是小于不是小于等于
9 printf("0.0");
10 else{
11 if(fabs(a)>eps) printf("%.1f",a);//a不为0
12 if(b>0&&fabs(a)>eps&&fabs(b)>eps) printf("+");//a,b均不为0且b>0
13 if(fabs(b)>eps) printf("%.1fi",b);//b不为0
14 }
15 printf("\n");
16 }
17 int main()
18 {
19 scanf("%lf%lf%lf%lf",&a1,&b1,&a2,&b2);
20 /* 1.+ */
21 a = a1+a2;
22 b = b1+b2;
23 print('+');
24 /* 2.- */
25 a = a1-a2;
26 b = b1-b2;
27 print('-');
28 /* 3.* */
29 a = a1*a2-b1*b2;
30 b = a1*b2+b1*a2;
31 print('*');
32 /* 4./ */
33 a = (a1*a2+b1*b2)/(a2*a2+b2*b2);
34 b = (b1*a2-a1*b2)/(a2*a2+b2*b2);
35 print('/');
36 return 0;
37 }
将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。
输入格式:
每个输入包含一个测试用例,即正整数N (0<N≤30)。
输出格式:
按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N1={,}和N2={,},若存在i使得,,但是ni+1<mi+1,则N1序列必定在N2序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。
输入样例:
7
输出样例:
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7
1 #include<stdio.h>
2 int N = 7;
3 int s[31]; // 数组栈
4 int top = -1; // 数组指针
5 int count = 0; // 统计输出的次数
6 int sum = 0; // 拆分项累加和
7
8 void division (int i);
9 void print();
10 int main ()
11 {
12 scanf ("%d", &N);
13 division (1);
14 return 0;
15 }
16 void print()
17 {
18 count ++; //输出计数
19 printf("%d=", N);
20 for (int k=0; k<top; k++)
21 printf("%d+", s[k]);//输出
22 if (count%4 == 0 || s[top] == N)
23 printf("%d\n", s[top]);//输出并换行
24 else
25 printf("%d;", s[top]);//输出不换行
26 }
27 void division (int i) //拆分
28 { //j<=N-sum控制sum小于等于N
29 for (int j=i; j<=N-sum; j++)
30 {
31 s[++top] = j;//压栈
32 sum += j; //累加
33 division (j);//sum不等于N,递归调用,继续压栈累加
34 if(sum == N)//sum==N打印
35 print();
36 sum -= j;//退出上一个top的元素
37 top --; //弹出上一个top的元素
38 }
39 }
给定某数字A(1)以及非负整数N(0),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,1。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
1 #include <stdio.h>
2 int main()
3 {
4 int s[200000] = {0};
5 int a, n, t, c = 0;
6 scanf("%d%d",&a,&n);
7 /* 最小n */
8 if(!n)
9 {
10 printf("0\n");
11 return 0;
12 }
13 /* 数列之和s的个位是a的n倍,依次递减 */
14 t = n; //n进位递增,t递减
15 for(int i=0; i<n; i++)
16 {
17 s[i] = a*t + c;//c是进位
18 if(s[i]>9)
19 {
20 c = s[i]/10;
21 s[i] %= 10;
22 if(i==n-1) n++;//进位递增
23 }
24 t--;
25 }
26 /* 从最高位读起 */
27 for(int i=n-1; i>=0; i--)
28 printf("%d",s[i]);
29 printf("\n");
30 return 0;
31 }
来源:oschina
链接:https://my.oschina.net/u/4258221/blog/3381465