您的位置:首页 > 编程语言 > C语言/C++

PATC语言1-50

2015-07-04 22:21 579 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: