1 IO-03. 求整数均值(10)
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
输入格式:输入在一行中给出4个整数,其间以空格分隔。
输出格式:在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后1位。
输入样例:
1 2 3 4
输出样例:
Sum = 10; Average = 2.5
#include <stdio.h>
int main(void) {
int a, b, c, d;
int sum;
double average;
scanf("%d%d%d%d", &a, &b, &c, &d);
sum = a + b + c + d;
average = sum / 4.0;
printf("Sum = %d; Average = %.1f\n", sum, average);
return 0;
}
2 IO-04. 混合类型数据格式化输入(5)
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
#include<stdio.h>
int main(void)
{
double a,b;
int c;
char ch;
scanf("%lf %d %c %lf",&a,&c,&ch,&b);
printf("%c %d %.2lf %.2lf",ch,c,a,b);
return 0;
}
3 分支-01. 超速判断(10)
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出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
#include<stdio.h>
int main(void)
{
int a;
scanf("%d",&a);
printf("Speed: %d - ",a);
if(a<=60)
printf("OK");
else printf("Speeding");
return 0;
}
4 分支-02. 三角形判断(15)
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
输入格式:
输入在一行中顺序给出6个[-100, 100]范围内的数字,即3个点的坐标x1, y1, x2, y2, x3, y3。
输出格式:
若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。
输入样例1:
4 5 6 9 7 8
输出样例1:
L = 10.13, A = 3.00
输入样例2:
4 6 8 12 12 18
输出样例2:
Impossible
#include <stdio.h>
#include <math.h>
int main(void) {
double x1, y1, x2, y2, x3, y3;
double side1, side2, side3;
double p, perimeter, area;
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
side1 = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
side2 = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1));
side3 = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
if(side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1) {
perimeter = side1 + side2 + side3;
p = 0.5 * perimeter;
area = sqrt(p * (p - side1) * (p - side2) * (p - side3));
printf("L = %.2f, A = %.2f\n", perimeter, area);
}
else
printf("Impossible");
return 0;
5 分支-03. 三天打鱼两天晒网(15)
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出1个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34
#include<stdio.h>
int main(void)
{
int a,b,c,d,e;
scanf("%d %d %d %d",&a,&b,&c,&d);
e=a+b+c+d;
printf("Sum = %d; Average = %.1f",e,e/4.0);
return 0;
}
6 分支-04. 出租车计价(15)
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费 )。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
输入样例1:
2.6 2
输出样例1:
10
#include <stdio.h>
int main(void) {
double distance;
int minute;
double fare = 0;
scanf("%lf%d", &distance, &minute);
if(minute >= 5)
fare = (minute / 5) * 2;
if(distance <= 3) {
fare += 10;
}
else if(distance <= 13) {
if(distance - 10 > 0)
fare += 10 + 7 * 2 + (distance - 10) * 3;
else
fare += 10 + (distance - 3) * 2;
}
else {
fare += 10 + 7 * 2 + (distance - 10) * 3;
}
printf("%d\n", (int)(fare + 0.5)); //四舍五入
return 0;
}
7 分支-05. 用天平找小球(10)
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:
在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C
#include<stdio.h>
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b)printf("C");
if(a==c)printf("B");
if(b==c)printf("A");
return 0;
}
8 分支-06. 成绩转换(15)
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出1个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
输入样例:
90
输出样例:
A
#include<stdio.h>
int main(void)
{
int a;
scanf("%d",&a);
if(a>=90)printf("A");
if(a<90&&a>=80)printf("B");
if(a<80&&a>=70)printf("C");
if(a<70&&a>=60)printf("D");
if(a<60)printf("E");
return 0;
}
9 分支-07. 比较大小(10)
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
#include<stdio.h>
int main(void)
{
int a,b,c,t; //多增加一个数来交换
scanf("%d %d %d",&a,&b,&c);
if(a<b){
t=b;b=a;a=t;
};
if(a<c){
t=c;c=a;a=t;
};
if(b<c){
t=c;c=b;b=t;
};
printf("%d->%d->%d",c,b,a);
return 0;
}
10 分支-08. 高速公路超速处罚(15)
按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
输入格式:
输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。
输出格式:
在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。
输入样例1:
65 60
输出样例1:
OK
1) #include <stdio.h>
int main(void) {
int speed, limit, exceed;
scanf("%d%d", &speed, &limit);
exceed = 1.0 * (speed - limit) / limit * 100 + 0.5;
if(exceed < 10)
printf("OK\n");
else if(exceed < 50)
printf("Exceed %d%%. Ticket 200", exceed);
else
printf("Exceed %d%%. License Revoked", exceed);
return 0;
}
2)#include<stdio.h>
int main(void)
{
int cars,limits,per,p;
scanf("%d %d",&cars,&limits);
p=(cars-limits)/1.0/limits*1000;
if(p%10>=5) per=p/10+1;
else per=p/10;
if(cars*10<limits*11)
printf("OK");
else{
printf("Exceed %d%%. ",per);
if(per>=10&&per<50)
printf("Ticket 200");
else printf("License Revoked");
};
return 0;
}
11 分支-09. 分段计算居民水费(10)
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x-17.5。请编写程序实现水费的计算。
输入格式:
输入在一行中给出非负实数x。
输出格式:
在一行输出应交的水费,精确到小数点后2位。
输入样例1:
12
输出样例1:
16.00
#include<stdio.h>
int main(void)
{
double x,y;
scanf("%lf",&x);
if(x<=15) y=4*x/3;
else y=2.5*x-17.5;
printf("%.2lf",y);
return 0;
}
12 分支-10. 计算个人所得税(10)
假设个人所得税为:税率 * (工资 - 1600)。请编写程序计算应缴的所得税,其中税率定义为:
当工资不超过1600时,税率为0;
当工资在区间(1600, 2500]时,税率为5%;
当工资在区间(2500, 3500]时,税率为10%;
当工资在区间(3500, 4500]时,税率为15%;
当工资超过4500时,税率为20%。
输入格式:
输入在一行中给出非负工资。
输出格式:
在一行输出个人所得税,精确到小数点后2位。
输入样例1:
1600
输出样例1:
0.00
#include<stdio.h>
int main(void)
{
int salary;
double tax,rate;
scanf("%d",&salary);
if(salary<=1600) tax=0;
else{
if(salary>1600&&salary<=2500) rate=0.05;
if(salary>2500&&salary<=3500) rate=0.1;
if(salary>3500&&salary<=4500) rate=0.15;
if(salary>4500) rate=0.2;
tax=(salary-1600)*rate;
}
printf("%.2lf",tax);
return 0;
}
13 分支-11. 计算工资(15)
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式:
在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
#include<stdio.h>
int main(void)
{
int year,hour;
double wage,salary;
scanf("%d %d",&year,&hour);
if(year<5) wage=30;
else wage=50;
if(hour<=40) salary=wage*hour;
else salary=40*wage+(hour-40)*1.5*wage;
printf("%.2lf",salary);
return 0;
}
14 分支-12. 计算火车运行时间(15)
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
输入样例:
1201 1530
输出样例:
03:29
1) #include<stdio.h>
int main(void)
{
int a,b,c,d;
scanf("%d %d",&a,&b);
c=b%100-a%100;
if(c<0){
c=60+c;b=b-100;
}
d=b/100-a/100;
if(d<10)printf("0%d:",d);
else printf("%d:",d);
if(c<10)printf("0%d",c);
else printf("%d",c);
return 0;
}
2)#include<stdio.h>
int main(void)
{
int a,b,c,d;
scanf("%d %d",&a,&b);
c=b%100-a%100;
if(c<0){
c=60+c;b=b-100;
}
d=b/100-a/100;
if(d<10)printf("0%d:",d);
else printf("%d:",d);
if(c<10)printf("0%d",c);
else printf("%d",c);
return 0;
}
15 分支-13. 计算天数(15)
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
1)#include<stdio.h>
int main(void)
{
int year,mouth,day,i,b;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
b=0;
scanf("%d/%d/%d",&year,&mouth,&day);
if((year%4==0&&year%100!=0)||year%400==0) a[1]=29;
for(i=0;i<mouth-1;i++) b=b+a[i];
b=b+day;
printf("%d",b);
return 0;
}
2)#include <stdio.h>
int main(void) {
int year, month, day;
int days;
int i;
scanf("%d/%d/%d", &year, &month, &day);
days = day;
for(i = 1; i < month; ++i) {
switch(i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days += 31;
break;
case 4:
case 6:
case 9:
case 11:
days += 30;
break;
case 2:
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
days += 29;
else
days += 28;
}
}
printf("%d\n", days);
return 0;
}
16 分支-14. 简单计算器(10)
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出“ERROR”。
输入样例1:
-7 / 2
输出样例1:
-3
1)#include<stdio.h>
int main(void)
{
int a,b;
char ch;
scanf("%d %c %d",&a,&ch,&b);
if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='%')
printf("ERROR");
else{
if(ch=='+') printf("%d",a+b);
if(ch=='-') printf("%d",a-b);
if(ch=='*') printf("%d",a*b);
if(ch=='/') printf("%d",a/b);
if(ch=='%') printf("%d",a%b);
}
return 0;
}
2)#include <stdio.h>
int main(void) {
int a, b;
char ch;
scanf("%d %c%d", &a, &ch, &b);
switch(ch) {
case '+':
printf("%d\n", a + b);
break;
case '-':
printf("%d\n", a - b);
break;
case '*':
printf("%d\n", a * b);
break;
case '/':
printf("%d\n", a / b);
break;
case '%':
printf("%d\n", a % b);
break;
default:
printf("ERROR\n");
break;
}
return 0;
}
17 分支-15. 日K蜡烛图(15)
股票价格涨跌趋势,常用蜡烛图技术中的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
#include<stdio.h>
int main(void)
{
double open,high,low,close,a,b;
scanf("%lf %lf %lf %lf",&open,&high,&low,&close);
if(open<close) printf("R-Hollow");
if(open==close) printf("R-Cross");
if(open>close) printf("BW-Solid");
if(open<=close){
a=open;b=close;
}else{
a=close;b=open;
};
if(low<a&&high>b) printf(" with Lower Shadow and Upper Shadow");
if(low<a&&high<=b) printf(" with Lower Shadow");
if(low>=a&&high>b) printf(" with Upper Shadow");
return 0;
}
18 分支-16. 计算分段函数(10)
注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
输入样例1:
10
输出样例1:
f(10.00) = 3.16
#include<stdio.h>
#include<math.h>
int main(void)
{
double x,y;
scanf("%lf",&x);
if(x>=0) y=pow(x,0.5);
else y=pow(x+1,2)+2*x+1/x;
printf("f(%.2lf) = %.2lf",x,y);
return 0;
}
19 分支-17. 统计学生成绩(15)
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在第1行中给出1个正整数N(<=1000),即学生人数;第2行中给出N个学生的百分制成绩,其间以空格分隔。
输出格式:
在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
输入样例:
7
77 54 92 73 60 65 69
输出样例:
1 0 2 3 1
#include<stdio.h>
int main(void)
{
int n,a[1000],i,j,A,B,C,D,E;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
A=B=C=D=E=0;
for(j=0;j<n;j++){
if(a[j]>=90) A++;
if(a[j]<90&&a[j]>=80) B++;
if(a[j]<80&&a[j]>=70) C++;
if(a[j]<70&&a[j]>=60) D++;
if(a[j]<60) E++;
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0;
}
20 分支-18. 求一元二次方程的根(20)
本题目要求一元二次方程 a*x2+b*x+c=0 的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a, b, c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
输入样例 1:
2.1 8.9 3.5
输出样例 1:
-0.44
-3.80
#include<stdio.h>
#include<math.h>
int main(void)
{
double a,b,c,p,x1,x2,t;
scanf("%lf %lf %lf",&a,&b,&c);
if(a==0&&b==0&&c==0) printf("Zero Equation");
if(a==0&&b==0&&c!=0) printf("Not An Equation");
p=pow(b,2)-4*a*c;
if(a==0&&b!=0){
x1=-c/b;
printf("%.2lf",x1);
};
if(a!=0){
if(p>0) {
x1=(-b+sqrt(p))/2/a;
x2=(-b-sqrt(p))/2/a;
if(x2>x1){
t=x2,x2=x1,x1=t;
}
printf("%.2lf\n%.2lf",x1,x2);
};
if(p==0){
x1=-b/2/a;
printf("%.2lf",x1);
};
if(p<0){
x1=-b/2/a;
x2=sqrt(-p)/2/a;
if(a>0){
if(b!=0) {
printf("%.2lf%+.2lfi\n",x1,x2);
printf("%.2lf%+.2lfi",x1,-x2);
}
else {
printf("0.00%+.2lfi\n",x2);
printf("0.00%+.2lfi",-x2);
}}
else{
if(b!=0){
printf("%.2lf%+.2lfi\n",x1,x2);
printf("%.2lf%+.2lfi",x1,-x2);
}
else {
printf("0.00%+.2lfi\n",x2);
printf("0.00%+.2lfi",-x2);
}
}}}
return 0;
}
21 分支-19. 阶梯电价(15)
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留2位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
输入样例 1:
10
输出样例 1:
cost = 5.30
#include<stdio.h>
int main(void)
{
double quantity;
scanf("%lf",&quantity);
if(quantity<0) printf("Invalid Value!");
else{
if(quantity<=50.0) printf("cost = %.2lf",quantity*0.53);
else printf("cost = %.2lf",(quantity-50)*0.58+50*0.53);
}
return 0;
}
22 分支-20. 计算符号函数的值(10)
对于任一整数n,符号函数sign(n)的定义如下:
请编写程序计算该函数对任一输入整数的值。
输入格式:
输入在一行中给出整数n。
输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。
输入样例 1:
10
输出样例 1:
sign(10) = 1
#include<stdio.h>
int main(void)
{
int n,y;
scanf("%d",&n);
if(n<0) y=-1;
if(n==0) y=0;
if(n>0) y=1;
printf("sign(%d) = %d",n,y);
return 0;
}
23 字符串-01. 在字符串中查找指定字符(15)
输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。
输入格式:
输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。
输出格式:
在一行中按照题目要求输出结果。
输入样例1:
It is a black box
b
输出样例1:
black box
#include<stdio.h>
#include<string.h>
int main(void)
{
char s[80],ch,*p;
gets(s);
scanf("%c",&ch);
p=strchr(s,ch);
if(p==NULL) puts("Not found");
else puts(p);
return 0;
}
24 字符串-02. 删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
#include<string.h>
#include<stdio.h>
int main(){
char str[200];
char str_d[200];
char tmp[200];
int i, len_str, len_str_d;
fgets(str, sizeof(str), stdin);
fgets(str_d, sizeof(str_d), stdin);
len_str = strlen(str) - 1;
str[len_str] = 0;
len_str_d = strlen(str_d) - 1;
str_d[len_str_d] = 0;
i = 0;
while(str[i] != 0){
if(str[i] == str_d[0]){
strncpy(tmp, str+i, len_str_d);
tmp[len_str_d] = 0;
if(!strcmp(tmp, str_d)){
str[i] = 0;
strcat(str, str + i + len_str_d);
i = 0;
continue;
}
}
++i;
}
printf("%s\n", str);
return 0;
}
`fgets'--get character string from a file or stream
从文件或者流中获取字符串
stdin是标准输入流
char *strncpy( char *to, const char *from, size_t count );
功能:将字符串from 中至多count个字符复制到字符串to中。如果字符串from 的长度小于count,其余部分用'\0'填补。返回处理完成的字符串。
strcmp这是一个字符串比较函数,如果两个字符串相等,则返回0,if(!strcmp(str1,str2))这个语句的意思就是如果这个两个字符串相等,就执行后面的语句。
strcat(p1,p2)就是把p2所指的字符串,连接到p1后面。
如char *p1="ab",char *p2="cd"; strcat(p1,p2)后,则p1指向"abcd",
strcat返回的是p1的指针。
strcpy就是把些时p1所指的内容,放在str+2的位置上。
比如str指向"xyz",
则strcpy后,str指向值为“xyabcd
25 字符串-03. 字符串的冒泡排序
我们已经知道了将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>
#include <string.h>
int main(void) {
char str[101][11], temp[11];
int i, j, n, k;
scanf("%d%d", &n, &k);
for(i = 0; i < n; ++i)
scanf("%s", str[i]);
for(i = 1; i < n; ++i) {
for(j = 0; j < n - i; ++j) {
if(strcmp(str[j], str[j + 1]) > 0) {
strcpy(temp, str[j]);
strcpy(str[j], str[j + 1]);
strcpy(str[j + 1], temp);
}
}
if(i == k)
break;
}
for(i = 0; i < n; ++i)
printf("%s\n", str[i]);
return 0;
}
2)#include <string>
#include <iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
string s[101];
for(int i=0;i<n;i++)
{
cin>>s[i];
}
string tmp;
for(int i=0;i<k;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(s[j+1]<s[j])
{ tmp=s[j];
s[j]=s[j+1];
s[j+1]=tmp;
}
}
}
for(int i=0;i<n;i++)
{
cout<<s[i]<<endl;
}
}
26 字符串-04. 字符串逆序(15)
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
输出样例:
!dlroW olleH
1)#include <stdio.h>
#include <string.h>
#define STRING_SIZE 80
int main(void) {
char str[STRING_SIZE + 1];
int i, len;
char ch;
gets(str);
len = strlen(str);
for(i = 0; i < len / 2; ++i) {
ch = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = ch;
}
printf("%s\n", str);
return 0;
}
2)#include<stdio.h>
#include<string.h>
int main(void)
{
char s[80];
int i=0,j;
gets(s);
while(s[i]!='\0'){
i++;
}
for(j=i-1;j>=0;j--){
putchar(s[j]);
}
return 0;
}
27 字符串-05. 字符串循环左移(20)
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
1)#include <stdio.h>
#include <string.h>
#define STRING_SIZE 100
int main(void) {
char str[STRING_SIZE + 1], ch;
int i, j, n, len;
gets(str);
scanf("%d", &n);
len = strlen(str);
for(i = 1; i <= n; ++i) {
ch = str[0];
for(j = 0; j < len - 1; ++j)
str[j] = str[j + 1];
str[len - 1] = ch;
}
printf("%s\n", str);
return 0;
}
2)#include<stdio.h>
#include<string.h>
int main(void)
{
char s[100],t;
int i,n,num=0,j;
gets(s);
scanf("%d",&n);
while(s[num]!='\0')
num++;
for(i=0;i<n;i++){
t=s[0];
for(j=0;j<num;j++){
s[j]=s[j+1];
}
s[num-1]=t;
}
puts(s);
return 0;
}
28 字符串-06. IP地址转换(20)
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:
输入在一行中给出32位二进制字符串。
输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114
1)#include <stdio.h>
#include <math.h>
#include <string.h>
#define STRING_SIZE 32
int main() {
char str[STRING_SIZE + 1], ip[8];
int i, j, sum;
gets(str);
for(i = 0; i < 4; ++i) {
sum = 0;
/* 取子串 */
strncpy(ip, str + i * 8, 8);
ip[8] = '\0';
/* 转换为十进制 */
for(j = 0; j < 8; ++j) {
if(ip[j] == '1')
sum += pow(2, 8 - j - 1);
}
if(i == 3)
printf("%d\n", sum);
else
printf("%d.", sum);
}
return 0;
}
2) #include<stdio.h>
#include<string.h>
#include<math.h>
#define n 8
int main(void)
{
char s[32];
int i,j,sum[4]={0},k=0;
gets(s);
for(i=0;i<30;i=i+8){
for(j=i;j<i+n;j++){
if(s[j]=='1'){
sum[k]+=pow(2,7-(j-i));
}
}
k++;
}
printf("%d.%d.%d.%d",sum[0],sum[1],sum[2],sum[3]);
return 0;
}
29 字符串-07. 说反话-加强版 (20)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
stack<string> s;
string sp;
bool flag=false;
while(cin>>sp)
s.push(sp);
while(!s.empty())
{
if(flag)
cout<<" ";
else
flag=true;
cout<<s.top();
s.pop();
}
return 0;
}
30 循环-01. 求整数段和(15)
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中-100<=A<=B<=100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中输出全部数字的和。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
#include<stdio.h>
int main(void)
{
int A,B,i,j,sum;
sum=0;
scanf("%d %d",&A,&B);
for(i=A,j=1;i<=B;i++,j++){
printf("%5d",i);
if(j%5==0) printf("\n");
sum+=i;
};
if((j-1)%5!=0) printf("\n");
printf("Sum = %d\n",sum);
return 0;
}
31 循环-02. 计算圆周率(15)
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
#include<stdio.h>
int main(void)
{
int i;
double deno,num,temp,pi,a;
scanf("%lf",&a);
for(temp=1,i=1,pi=1,num=1,deno=1;temp>=a;i++){
num*=i;
deno*=2*(i+1)-1;
temp=num/deno;
pi+=temp;
}
printf("%.6lf\n",2*pi);
return 0;
}
32 循环-03. 求符合给定条件的整数集(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
#include<stdio.h>
int main(void)
{
int a,i,j,k,b;
scanf("%d",&a);
b=0;
for(i=a;i<=a+3;i++)
for(j=a;j<=a+3;j++){
if(j==i) continue;
else for(k=a;k<=a+3;k++){
if(k==i||k==j) continue;
else{
printf("%d%d%d",i,j,k);
b++;
if(b%6==0) printf("\n");
else printf(" ");
}
}}
return 0;
}
33 循环-04. 验证“哥德巴赫猜想”(20)
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p <= q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19
#include<stdio.h>
#include<stdbool.h>
int main(void)
{
int n,p,i,j;
bool pisprime,qisprime;
scanf("%d",&n);
for(p=2;p<=n;p++){
for(i=2,pisprime=true;i*i<=p;i++){
if(p%i==0){
pisprime=false;break;
}
}
for(j=2,qisprime=true;j*j<=n-p;j++)
if((n-p)%j==0){
qisprime=false;break;
}
if(pisprime&&qisprime) break;
}
printf("%d = %d + %d\n",n,p,n-p);
return 0;
}
34 循环-05. 兔子繁衍问题(15)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:输入在一行中给出一个不超过10000的正整数N。
输出格式:在一行中输出兔子总数达到N最少需要的月数。
输入样例:30 输出样例:9
#include<stdio.h>
int main(void)
{
int x,n,mon,num;
int f(int x);
scanf("%d",&n);
for(num=1,mon=1;num<n;){
mon++; num=f(mon);
}
printf("%d",mon);
return 0;
}
int f(int x)
{
int y;
if(x>2) y=f(x-1)+f(x-2);
else y=1;
return y;
}
35 循环-06. 统计一行文本的单词个数(15)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
#include<stdio.h>
#include<ctype.h>
int main(void)
{
char ch;
int n=0,inword=0;
do{
ch=getchar();
if(!isspace(ch)&&(inword==0)){
n++;inword=1;
}
if(isspace(ch)&&(inword==1))
inword=0;
}while(ch!='\n');
printf("%d",n);
return 0;
}
if (!isspace(c) && !inword) 如果c不是空格且之前的字符不是单词的一部分(即空格),那么就把n_words加一且inword置为真。如果你下一个输入的字符还是非空格,因为inword为真,所以n_words不会乱加一。
if (isspace(c) && inword) 说明如果这次输入的是空格,那么就说明一个单词的结束了,所以inword=false。
36 循环-07. 爬动的蠕虫(15)
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
#include<stdio.h>
int main(void)
{
int N,U,D,S,T;
scanf("%d%d%d",&N,&U,&D);
for(S=0,T=1;S<N;T++){
if(T%2!=0) S+=U;
if(S>=N) break;
if(T%2==0) S-=D;
}
printf("%d",T);
return 0;
}
37 循环-08. 二分法求多项式单根(20)
二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
#include<stdio.h>
double a3,a2,a1,a0;
int main(void)
{
int flag=1;
double a,b,x,y;
double f(double x);
scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);
scanf("%lf%lf",&a,&b);
while(b-a>=0.0001){
if(f(a)*f(b)==0){
if(f(a)==0) printf("%.2lf",a);
else printf("%.2lf",b);
flag=0;
break;}
if(f(a)*f(b)<0){
if(f((a+b)/2)==0){
printf("%.2lf",(a+b)/2);
flag=0;
break;
}
else y=f((a+b)/2)*f(a)<0?a:b;
}
a=(a+b)/2>y?y:(a+b)/2;
b=(a+b)/2<y?y:(a+b)/2;
}
if(flag) printf("%.2lf",(a+b)/2);
return 0;
}
double f(double x)
{
double y;
y=a3*x*x*x+a2*x*x+a1*x+a0;
return y;
}
38 循环-09. 支票面额(15)
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式“y.f”输出该支票的原始面额。如果无解,则输出“No Solution”。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
#include<stdio.h>
int main(void)
{
int f,y,n,z=1;
scanf("%d",&n);
for(f=0;f<100;f++)
for(y=0;y<f;y++){
if(f*100+y==200*y+2*f+n){
printf("%d.%d",y,f);
z=0;break;
}
}
if(z) printf("No Solution\n");
return 0;
}
39 循环-10. 求序列前N项和(15)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
#include<stdio.h>
int main()
{
double a = 1, b = 2, sum = 0;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
sum += b / a;
b = a + b;
a = b - a;
}
printf("%.2lf", sum);
return 0;
}
40 循环-11. 水仙花数(20)
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例 如:153 = 13 + 53+ 33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
#include<stdio.h>
#include<math.h>
int main()
{
int n, sum = 0;
scanf("%d", &n);
if (n <= 5)
{
for (int i = pow(10, n - 1); i <= pow(10, n) - 1; i++)
{
int j = i;
while (j != 0)
{
sum += pow(j % 10, n);
j /= 10;
}
if (sum == i)
{
printf("%d\n", i);
}
sum = 0;
}
}
if (n == 6)
{
printf("548834\n");
}
if (n == 7)
{
printf("1741725\n4210818\n9800817\n9926315");
}
return 0;
}
41 循环-12. 打印九九口诀表(15)
下面是一个完整的下三角九九口诀表:
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
本题要求对任意给定的1位正整数N,输出从1*1到N*N的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1<=N<=9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
#include<stdio.h>
int main(void)
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("%d*%d=%-4d",j,i,j*i);
}
printf("\n");
}
return 0;
}
42循环-13. 求特殊方程的正整数解(15)
本题要求对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(<=10000)。
输出格式:
输出方程X2+Y2=N的全部正整数解,其中X<=Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出“No Solution”。
输入样例1:
884
输出样例1:
10 28
#include<stdio.h>
#include<math.h>
int main(void)
{
int x,y,n,flag=1;
scanf("%d",&n);
for(x=1;2*x*x<n;x++)
for(y=x;y<=n;y++){
if(pow(x,2)+pow(y,2)==n&&x<=y){
printf("%d %d\n",x,y);
flag=0;
}
}
if(flag) printf("No Solution\n");
return 0;
}
43 循环-14. 最大公约数和最小公倍数(15)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出2个正整数M和N(<=1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include<stdio.h>
int main(void)
{
int m,n,a,b,i,j;
scanf("%d%d",&m,&n);
a=(m>=n)?m:n;
b=(m>=n)?n:m;
for(i=b;i<=b;i--)
if(a%i==0&&b%i==0){
printf("%d ",i);break;
}
for(j=a;j<=a*b;j++)
if(j%a==0&&j%b==0){
printf("%d",j);break;
}
return 0;
}
44 循环-15. 统计素数并求和(20)
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
#include<stdio.h>
int main(void)
{
int m,n,i,sum,a;
int f(int s);
scanf("%d %d",&m,&n);
for(i=m,sum=0,a=0;i<=n;i++)
if(f(i)){
a++;
sum+=i;
}
printf("%d %d",a,sum);
return 0;
}
int f(int s)
{
int j,k=1;
if(s==1) k=0;
for(j=2;j*j<=s;j++){
if(s%j==0){
k=0;break;
}
}
return k;
}
45 循环-16. 猴子吃桃问题(15)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N<=10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
#include<stdio.h>
int main(void)
{
int n,i,sum=1;
scanf("%d",&n);
for(i=n-1;i>0;i--){
sum=(sum+1)*2;
}
printf("%d",sum);
return 0;
}
46 循环-17. 简单计算器(20)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
#include<stdio.h>
int main(void)
{
int a,b,sum,s=1,i;
char ch;
scanf("%d",&a);
scanf("%c",&ch);
scanf("%d",&b);
sum=a;
while(ch!='='){
if(ch!='+'&&ch!='-'&&ch!='/'&&ch!='*'&&ch!='=') s=0;
if(ch=='+') sum+=b;
if(ch=='-') sum-=b;
if(ch=='*') sum*=b;
if(ch=='/'){
if(b!=0) sum/=b;
else if(s) s=0;
}
scanf("%c",&ch);
if(ch=='=') break;
scanf("%d",&b);
}
if(s) printf("%d",sum);
else printf("ERROR\n");
return 0;
}
47 循环-18. 龟兔赛跑(20)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出“@_@”,兔子赢输出“^_^”,平局则输出“-_-”;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
#include<stdio.h>
int main(void)
{
int tor=0,rab=0,rt=0,t,f,i;
scanf("%d",&t);
f=t/10;
for(i=0;i<f;i++){
if(rab>tor&&rt%4==0) rt++;
if(rab<=tor&&rt%4==0) rab+=90;
if(rt%4!=0) rt+=1;
tor+=30;
}
if(rab<=tor&&rt%4==0) rab+=9*(t-f*10);
tor+=3*(t-f*10);
if(tor>rab) printf("@_@ %d",tor);
if(tor<rab) printf("^_^ %d",rab);
if(tor==rab) printf("-_- %d",tor);
return 0;
}
48循环-19. 币值转换(20)
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
#include<stdio.h>
#include<math.h>
int n,s=0;
int main(void)
{
int i,j,k,p=1,flag=1;
int f(int q,int n);
scanf("%d",&n);
for(i=0;n/p>=10;i++){
p=pow(10,i);
s++;
}
if(n==0) printf("a");
if(n<10&&n>=0) s=1;
for(j=1;j<=s;j++){
switch(f(j,n)){
case 0:if(j!=s&&j!=s-4){
if(f(j+1,n)==0) flag=0;
else flag=1;
if(flag)printf("a");break;
};break;
case 1:printf("b");break;
case 2:printf("c");break;
case 3:printf("d");break;
case 4:printf("e");break;
case 5:printf("f");break;
case 6:printf("g");break;
case 7:printf("h");break;
case 8:printf("i");break;
case 9:printf("j");break;
}
if(f(j,n)==0&&j!=s&&j!=s-4) continue;
else{
if(s==9&&j==5){
if(f(2,n)==0&&f(3,n)==0&&f(4,n)==0&&f(5,n)==0)
continue;
}
switch(s-j){
case 1:printf("S");break;
case 2:printf("B");break;
case 3:printf("Q");break;
case 4:printf("W");break;
case 5:printf("S");break;
case 6:printf("B");break;
case 7:printf("Q");break;
case 8:printf("Y");break;
}
}}
return 0;
}
int f(int q,int n)
{
int k,a;
if(q==1) k=n/pow(10,s-1);
else{
a=n/pow(10,s-q+1);
k=n/pow(10,s-q)-a*10;
}
return k;
}
49 循环-20. 猜数字游戏(15)
猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数、以及猜测的最大次数N。随后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
#include<stdio.h>
int main(void)
{
int num,N,i,a;
scanf("%d%d",&num,&N);
for(i=0;i<=N;i++){
scanf("%d",&a);
if(a<0){printf("Game Over\n");break;}
if(a>num) printf("Too big\n");
if(a==num&&i<1){printf("Bingo!\n");break;}
if(a==num&&i<3){printf("Lucky You!\n");break;}
if(a==num&&i>2&&i<N){printf("Good Guess!\n");break;}
if(a<num){printf("Too small\n");}
}
if(i>N) printf("Game Over\n");
return 0;
}
50 循环-21. 求交错序列前N项和(15)
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留3位小数。
输入样例:
5
输出样例:
0.917
#include<stdio.h>
#include<math.h>
int main(void)
{
int deno=1,fl=1,i,n;
double sum=0;
scanf("%d",&n);
for(i=0;i<n;i++){
sum+=1.0*fl/deno*pow(-1,i%2);
fl++;
deno=2*fl-1;
}
printf("%.3lf",sum);
return 0;
}