信息学奥赛一本通(C++版)第一部分 C++语言 第三章 程序的控制结构

第三章 程序的控制结构

第一节 if选择结构

T1039 : 判断数正负

【题目描述】

  给定一个整数 N N N,判断其正负。如果 N > 0 N>0 N>0,输出positive;如果 N = 0 N=0 N=0,输出zero;如果 N < 0 N<0 N<0,输出negative

【输入】

  一个整数 N ( − 1 0 9 ≤ N ≤ 1 0 9 ) N(−10^{9}≤N≤10^{9}) N(109N109)

【输出】

  如果 N > 0 N>0 N>0,输出positive;

  如果 N = 0 N=0 N=0,输出zero;

  如果 N < 0 N<0 N<0,输出negative

【输入样例】

1

【输出样例】

positive

【答案&代码】

#include
#include
int main(void){
	int n;
	scanf("%d",&n);
	if(n>0)
		printf("positive");
	else if(n==0)
		printf("zero");
	else
		printf("negative");
	return 0;
}

T1040 : 输出绝对值

【题目描述】

  输入一个浮点数,输出这个浮点数的绝对值,保留到小数点后两位。

【输入】

  输入一个浮点数,其绝对值不超过 10000 10000 10000

【输出】

  输出这个浮点数的绝对值,保留到小数点后两位。

【输入样例】

-3.14

【输出样例】

3.14

【答案&代码】

#include
int main(void){
	double n;
	scanf("%lf",&n);
	if(n>=0)
		printf("%.2f",n);
	else
		printf("%.2f",-1*n);
	return 0;
}

T1041 : 奇偶数判断

【题目描述】

  给定一个整数,判断该数是奇数还是偶数。如果 n n n是奇数,输出odd;如果 n n n是偶数,输出even

【输入】

  输入仅一行,一个大于零的正整数 n n n

【输出】

  输出仅一行,如果 n n n是奇数,输出odd;如果 n n n是偶数,输出even

【输入样例】

5

【输出样例】

odd

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	if(n%2==0)
		printf("even");
	else
		printf("odd");
	return 0;
}

T1042 : 奇偶ASCII值判断

【题目描述】

  任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO。例如,字符AASCII值是65,则输出YES,若输入字符B(ASCII值是66),则输出NO

【输入】

  输入一个字符。

【输出】

  如果其ASCII值为奇数,则输出YES,否则,输出NO

【输入样例】

A

【输出样例】

YES

【答案&代码】

#include
int main(void){
	char ch;
	scanf("%c",&ch);
	if(ch%2==0)
		printf("NO");
	else
		printf("YES");
	return 0;
}

T1043 : 整数大小比较

【题目描述】

  输入两个整数,比较它们的大小。若 x > y x>y x>y,输出>;若 x = y x=y x=y,输出=;若 x < y x<y x<y,输出<

【输入】

  一行,包含两个整数 x x x y y y,中间用单个空格隔开。 0 ≤ x < 2 32 , − 2 31 ≤ y < 2 31 0≤x<2^{32},−2^{31}≤y<2^{31} 0x<232,231y<231

【输出】

  一个字符。若 x > y x>y x>y,输出>;若 x = y x=y x=y,输出=;若 x < y x<y x<y,输出<

【输入样例】

1000 100

【输出样例】

>

【答案&代码】

#include
int main(void){
	int x,y;
	scanf("%d%d",&x,&y);
	if(x>y)
		printf(">");
	else if(x==y)
		printf("=");
	else
		printf("<");
	return 0;
}

T1044 : 判断是否为两位数

【题目描述】

  判断一个正整数是否是两位数(即大于等于 10 10 10且小于等于 99 99 99)。若该正整数是两位数,输出 1 1 1,否则输出 0 0 0

【输入】

  一个正整数,不超过 1000 1000 1000

【输出】

  一行。若该正整数是两位数,输出 1 1 1,否则输出 0 0 0

【输入样例】

54

【输出样例】

1

【答案&代码】

#include
int main(void){
	int x,y;
	scanf("%d%d",&x,&y);
	if(x>y)
		printf(">");
	else if(x==y)
		printf("=");
	else
		printf("<");
	return 0;
}

T1045 : 收集瓶盖赢大奖

【题目描述】

  某饮料公司最近推出了一个“收集瓶盖赢大奖”的活动:如果你拥有 10 10 10个印有“幸运”、或 20 20 20个印有“鼓励”的瓶盖,就可以兑换一个神秘大奖。现分别给出你拥有的印有“幸运”和“鼓励”的瓶盖数,判断是否可以去兑换大奖。若可以兑换大奖,输出 1 1 1,否则输出 0 0 0

【输入】

  一行,包含两个整数,分别是印有“幸运”和“鼓励”的瓶盖数,用一个空格隔开。

【输出】

  一行。若可以兑换大奖,输出 1 1 1,否则输出 0 0 0

【输入样例】

11 19

【输出样例】

1

【答案&代码】

#include
int main(void){
	int xy,gl;
	scanf("%d%d",&xy,&gl);
	if(xy>=10||gl>=20)
		printf("1");
	else
		printf("0");
	return 0;
}

T1046 : 判断一个数能否同时被3和5整除

【题目描述】

  判断一个数 n n n能否同时被 3 3 3 5 5 5整除,如果能同时被 3 3 3 5 5 5整除输出YES,否则输出NO

【输入】

  输入一行,包含一个整数 n n n ( − 1 , 000 , 000 < n < 1 , 000 , 000 ) (-1,000,000<n<1,000,000) (1,000,000<n<1,000,000)

【输出】

  输出一行,如果能同时被 3 3 3 5 5 5整除输出YES,否则输出NO

【输入样例】

15

【输出样例】

YES

【答案&代码】

#include
int main(void){
	int num;
	scanf("%d",&num);
	if(num%3==0&&num%5==0)
		printf("YES");
	else
		printf("NO");
	return 0;
}

T1047 : 判断能否被3,5,7整除

【题目描述】

  给定一个整数,判断它能否被 3 , 5 , 7 3,5,7 3,5,7整除,并输出以下信息:

  1. 能同时被 3 , 5 , 7 3,5,7 3,5,7整除(直接输出 357 3 5 7 357,每个数中间一个空格);

  2. 只能被其中两个数整除(输出两个数,小的在前,大的在后。例如: 35 3 5 35或者 37 3 7 37或者 57 5 7 57,中间用空格分隔);

  3. 只能被其中一个数整除(输出这个除数);

  4. 不能被任何数整除,输出小写字符n,不包括单引号。

【输入】

  输入一行,包括一个整数。

【输出】

  输出一行,按照描述要求给出整数被 3 , 5 , 7 3,5,7 3,5,7整除的情况。

【输入样例】

105

【输出样例】

3 5 7

【答案&代码】

#include
int main(void){
	int num;
	scanf("%d",&num);
	if(num%105==0)
		printf("3 5 7");
	else if(num%3==0||num%5==0||num%7==0){
		if(num%3==0)
			printf("3 ");
		if(num%5==0)
			printf("5 ");
		if(num%7==0)
			printf("7 ");
	}
	else
		printf("n");
	return 0;
}

T1048 : 有一门课不及格的学生

【题目描述】

  给出一名学生的语文和数学成绩,判断他是否恰好有一门课不及格(成绩小于 60 60 60分)。若该生恰好有一门课不及格,输出 1 1 1;否则输出 0 0 0

【输入】

  一行,包含两个在 0 0 0 100 100 100之间的整数,分别是该生的语文成绩和数学成绩。

【输出】

  若该生恰好有一门课不及格,输出 1 1 1;否则输出 0 0 0

【输入样例】

50 80

【输出样例】

1

【答案&代码】

#include
int main(void){
	int ch,ma;
	scanf("%d%d",&ch,&ma);
	if(ch<60&&ma>=60)
		printf("1");
	else if(ch>=60&&ma<60)
		printf("1");
	else
		printf("0");
	return 0;
}

第二节 switch语句

T1049 : 晶晶赴约会

【题目描述】

  晶晶的朋友贝贝约晶晶下周一起去看展览,但晶晶每周的 1 , 3 , 5 1,3,5 1,3,5有课必须上课,请帮晶晶判断她能否接受贝贝的邀请,如果能输出YES;如果不能则输出NO。注意YESNO都是大写字母!

【输入】

  输入有一行,贝贝邀请晶晶去看展览的日期,用数字 1 1 1 7 7 7表示从星期一到星期日。

【输出】

  输出有一行,如果晶晶可以接受贝贝的邀请,输出YES,否则,输出NO。注意YESNO都是大写字母!

【输入样例】

2

【输出样例】

YES

【答案&代码】

#include
int main(void){
	int d;
	scanf("%d",&d);
	switch(d){
		case 1:
		case 3:
		case 5:
				printf("NO");break;
		default:
				printf("YES");break;
	}
	return 0;
}

T1050 : 骑车与走路

【题目描述】

  在清华校园里,没有自行车,上课办事会很不方便。但实际上。并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等,这要耽误一些时间。假设找到自行车,开锁并车上自行车的时间为 27 27 27秒;停车锁车的时间为 23 23 23秒;步行每秒行走 1.2 1.2 1.2米,骑车每秒行走 3.0 3.0 3.0米。请判断走不同的距离去办事,是骑车快还是走路快。如果骑车快,输出一行Bike;如果走路快,输出一行Walk;如果一样快,输出一行All

【输入】

  输入一行,包含一个整数,表示一次办事要行走的距离,单位为米。

【输出】

  输出一行,如果骑车快,输出一行Bike;如果走路快,输出一行Walk;如果一样快,输出一行All

【输入样例】

120

【输出样例】

Bike

【答案&代码】

#include
int main(void){
	int len;
	scanf("%d",&len);
	if(50+(double)len/3.0>(double)len/1.2)
		printf("Walk");
	else if(50+(double)len/3.0==(double)len/1.2)
		printf("All");
	else
		printf("Bike");
	return 0;
}

T1051 : 分段函数

【题目描述】

  编写程序,计算下列分段函数 y = f ( x ) y=f(x) y=f(x)的值。结果保留到小数点后三位。

	y=−x+2.5;          (0  ≤x<  5)
	y=2−1.5(x−3)(x−3)  (5  ≤x< 10)
	y=x2−1.5           (10 ≤x< 20)

【输入】

  一个浮点数 N ( 0 ≤ N < 20 ) N(0≤N<20) N(0N<20)

【输出】

  输出N对应的分段函数值: f ( N ) f(N) f(N)。结果保留到小数点后三位。

【输入样例】

1.0

【输出样例】

1.500

【答案&代码】

#include
int main(void){
	double x,y;
	scanf("%lf",&x);
	if(0<=x&&x<5)
		y=-x+2.5;
	else if(5<=x&&x<10)
		y=2-1.5*(x-3)*(x-3);
	else if(10<=x&&x<20)
		y=x/2-1.5;
	printf("%.3f",y);
	return 0;
}

T1052 : 计算邮资

【题目描述】

  根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在 1000 1000 1000克以内(包括 1000 1000 1000克),基本费 8 8 8元。超过 1000 1000 1000克的部分,每 500 500 500克加收超重费 4 4 4元,不足 500 500 500克部分按 500 500 500克计算;如果用户选择加急,多收 5 5 5元。

【输入】

  输入一行,包含整数和一个字符,以一个空格分开,分别表示重量(单位为克)和是否加急。如果字符是y,说明选择加急;如果字符是n,说明不加急。

【输出】

  输出一行,包含一个整数,表示邮费。

【输入样例】

1200 y

【输出样例】

17

【答案&代码】

#include
#include
int main(void){
	int x;
	char ch;
	scanf("%d %c",&x,&ch);
	int sum;
	if(x<=1000)
		sum=8;
    else
		sum=8+ceil((double)(x-1000)/500)*4;
	if(ch=='y')
		sum+=5;
	printf("%d",sum);    
	return 0;
}

T1053 : 最大数输出

【题目描述】

  输入三个整数,数与数之间以一个空格分开。 输出一个整数,即最大的整数。

【输入】

  输入为一行,包含三个整数,数与数之间以一个空格分开。

【输出】

  输出一行,包含一个整数,即最大的整数。

【输入样例】

10 20 56

【输出样例】

56

【答案&代码】

#include
#include
int main(void){
	int num[3];
	for(int i=0;i<3;i++)
		scanf("%d",num+i);
	std::sort(num,num+3);
	printf("%d",num[2]);  
	return 0;
}

T1054 : 三角形判断

【题目描述】

  给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。如果能构成三角形,则输出yes,否则输出no

【输入】

  输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开。

【输出】

  如果能构成三角形,则输出yes,否则输出no

【输入样例】

3 4 5

【输出样例】

yes

【答案&代码】

#include
#include
int main(void){
	int num[3];
	for(int i=0;i<3;i++)
		scanf("%d",num+i);
	std::sort(num,num+3);
	if(num[0]+num[1]>num[2])
		printf("yes");
	else
		printf("no"); 
	return 0;
}

T1055 : 判断闰年

【题目描述】

  判断某年是否是闰年。如果公元 a a a年是闰年输出Y,否则输出N

【输入】

  输入只有一行,包含一个整数 a ( 0 < a < 3000 ) a(0<a<3000) a(0<a<3000)

【输出】

  一行,如果公元 a a a年是闰年输出Y,否则输出N

【输入样例】

2006

【输出样例】

N

【答案&代码】

#include
int main(void){
	int y;
	scanf("%d",&y);
	if(y%400==0)
		printf("Y");
	else if(y%4==0&&y%100!=0)
		printf("Y");
	else
		printf("N");
	return 0;
}

T1056 : 点和正方形的关系

【题目描述】

  有一个正方形,四个角的坐标 ( x , y ) (x,y) (x,y)分别是 ( 1 , − 1 ) , ( 1 , 1 ) , ( − 1 , − 1 ) , ( − 1 , 1 ) (1,-1),(1,1),(-1,-1),(-1,1) (1,1),(1,1),(1,1),(1,1) x x x是横轴, y y y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。如果点在正方形内,则输出yes,否则输出no

【输入】

  输入一行,包括两个整数 x , y x,y x,y,以一个空格分开,表示坐标 ( x , y ) (x,y) (x,y)

【输出】

  输出一行,如果点在正方形内,则输出yes,否则输出no

【输入样例】

1 1

【输出样例】

yes

【答案&代码】

#include
int main(void){
	int x,y;
	scanf("%d%d",&x,&y);
	if(-1<=x&&x<=1&&-1<=y&&y<=1)
		printf("yes");
	else
		printf("no");
	return 0;
}

T1057 : 简单计算器

【题目描述】

  一个最简单的计算器,支持 + , − , ∗ , / +,-,*,/ +,,,/四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。然而:

  1. 如果出现除数为 0 0 0的情况,则输出:Divided by zero!
  2. 如果出现无效的操作符(即不为 + , − , ∗ , / +,-,*,/ +,,,/之一),则输出:Invalid operator!

【输入】

  输入只有一行,共有三个参数,其中第 1 , 2 1,2 1,2个参数为整数,第 3 3 3个参数为操作符( + , − , ∗ , / +,-,*,/ +,,,/)。

【输出】

  输出只有一行,一个整数,为运算结果。然而:

  1. 如果出现除数为 0 0 0的情况,则输出:Divided by zero!
  2. 如果出现无效的操作符(即不为 + , − , ∗ , / +,-,*,/ +,,,/之一),则输出:Invalid operator!

【输入样例】

1 2 +

【输出样例】

3

【答案&代码】

#include
int main(void){
	int a,b;
	char op;
	scanf("%d %d %c",&a,&b,&op);
	int result;
	switch(op){
		case '+':
			result=a+b;
			printf("%d",result);
			break;
		case '-':
			result=a-b;
			printf("%d",result);
			break;
		case '*':
			result=a*b;
			printf("%d",result);
			break;
		case '/':
			if(b==0){
				printf("Divided by zero!");
				break;
			}
			result=a/b;
			printf("%d",result);
			break;
		default:
			printf("Invalid operator!");
			break;
	}
	return 0;
}

T1058 : 求一元二次方程

【题目描述】

  求一元二次方程 a x 2 + b x + c = 0 ax^{2}+bx+c=0 ax2+bx+c=0的根,其中 a a a不等于 0 0 0。结果要求精确到小数点后 5 5 5位。

【输入】

  输入一行,包含三个浮点数 a , b , c a,b,c a,b,c(它们之间以一个空格分开),分别表示方程 a x 2 + b x + c = 0 ax^{2}+bx+c=0 ax2+bx+c=0的系数。

【输出】

  输出一行,表示方程的解。

  若两个实根相等,则输出形式为:“ x 1 = x 2 = . . . x1=x2=... x1=x2=...”;

  若两个实根不等,在满足根小者在前的原则,则输出形式为:“ x 1 = . . . ; x 2 = . . . x1=...;x2=... x1=...;x2=...”;

  若无实根输出No answer!

  所有输出部分要求精确到小数点后 5 5 5位,数字、符号之间没有空格。

【输入样例】

-15.97 19.69 12.02

【输出样例】

x1=-0.44781;x2=1.68075

【答案&代码】

#include
#include
#define precision_1 1e-12
#define precision_2 1e-6
int main(void){
	double a,b,c,x1,x2,delta;
	scanf("%lf%lf%lf",&a,&b,&c);
	delta=b*b-4*a*c;
	if(delta<0&&fabs(delta)>precision_1)
		printf("No answer!\n");
	else if(fabs(delta)<precision_1){
		x1=-b/(2*a);
		if(fabs(x1)<precision_2)
			printf("x1=x2=%.5lf\n",0);
		else
			printf("x1=x2=%.5lf\n",x1);
	}
	else{
		x1=(-b+sqrt(delta))/(2*a);
		x2=(-b-sqrt(delta))/(2*a);
		if(fabs(x1)<precision_2)	x1=fabs(x1);
		if(fabs(x2)<precision_2)	x2=fabs(x2);
		if(x1<x2)
			printf("x1=%.5lf;x2=%.5lf",x1,x2);
		else 
			printf("x1=%.5lf;x2=%.5lf",x2,x1);
	}
	return 0;
}

你可能感兴趣的:(C++语言)