PATC语言1-50

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;

}

分支-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;  

分支-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;

分支-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;  

}

分支-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;

}

分支-05. 用天平找小球(10)

三个球ABC,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

 

输入格式:

输入在一行中给出3个正整数,顺序对应球ABC的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

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;

}

分支-06. 成绩转换(15)

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

大于等于90分为A

小于90且大于等于80B

小于80且大于等于70C

小于70且大于等于60D

小于60E

输入格式:

输入在一行中给出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;  

}   

分支-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)

本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

 

输入格式:

 

输入在一行中给出24位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

 

输出格式:

 

在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh2位小时数、mm2位分钟数。

 

输入样例:

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”(即“十字红蜡烛”)。如果LowOpenClose低,称为“Lower Shadow”(即“有下影线”),如果HighOpenClose高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

 

输入格式:

 

输入在一行中给出4个正实数,分别对应OpenHighLowClose,其间以空格分隔。

 

输出格式:

 

在一行中输出日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且大于等于80B

小于80且大于等于70C

小于70且大于等于60D

小于60E

输入格式:

 

输入在第1行中给出1个正整数N<=1000),即学生人数;第2行中给出N个学生的百分制成绩,其间以空格分隔。

 

输出格式:

 

在一行中输出ABCDE对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

 

输入样例:

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*x2b*xc的根,结果保留2位小数。

 

输入格式:

 

输入在一行中给出3个浮点系数a, b, c,中间用空格分开。

 

输出格式:

 

根据系数情况,输出不同结果:

 

1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;

2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;

3)如果方程只有一个根,则直接输出此根;

4)如果系数都为0,则输出"Zero Equation"

5)如果ab0c不为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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值