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

时间:2022-03-03 08:55:56

第三章 程序的控制结构



第一节 if选择结构

T1039 : 判断数正负

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

【输入】
  一个整数N(−109≤N≤109)。

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

  如果N=0, 输出zero;

  如果N<0, 输出negative。

【输入样例】
1
【输出样例】
positive
【答案&代码】

#include<stdio.h>
#include<math.h>
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。

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

【输入样例】
-3.14
【输出样例】
3.14
【答案&代码】

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

T1041 : 奇偶数判断

【题目描述】
  给定一个整数,判断该数是奇数还是偶数。如果n是奇数,输出odd;如果n是偶数,输出even。

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

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

【输入样例】
5
【输出样例】
odd
【答案&代码】

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

T1042 : 奇偶ASCII值判断

【题目描述】
  任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO。例如,字符A的ASCII值是65,则输出YES,若输入字符B(ASCII值是66),则输出NO。

【输入】
  输入一个字符。

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

【输入样例】
A
【输出样例】
YES
【答案&代码】

#include<stdio.h>
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

#include<stdio.h>
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且小于等于99)。若该正整数是两位数,输出1,否则输出0。

【输入】
  一个正整数,不超过1000。

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

【输入样例】
54
【输出样例】
1
【答案&代码】

#include<stdio.h>
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个印有“幸运”、或20个印有“鼓励”的瓶盖,就可以兑换一个神秘大奖。现分别给出你拥有的印有“幸运”和“鼓励”的瓶盖数,判断是否可以去兑换大奖。若可以兑换大奖,输出1,否则输出0。

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

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

【输入样例】
11 19
【输出样例】
1
【答案&代码】

#include<stdio.h>
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 能否同时被3和5整除,如果能同时被3和5整除输出YES,否则输出NO。

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

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

【输入样例】
15
【输出样例】
YES
【答案&代码】

#include<stdio.h>
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整除,并输出以下信息:

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

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

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

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

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

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

【输入样例】
105
【输出样例】
3 5 7
【答案&代码】

#include<stdio.h>
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分)。若该生恰好有一门课不及格,输出1;否则输出0。

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

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

【输入样例】
50 80
【输出样例】
1
【答案&代码】

#include<stdio.h>
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有课必须上课,请帮晶晶判断她能否接受贝贝的邀请,如果能输出YES;如果不能则输出NO。注意YES和NO都是大写字母!

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

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

【输入样例】
2
【输出样例】
YES
【答案&代码】

#include<stdio.h>
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秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒行走3.0米。请判断走不同的距离去办事,是骑车快还是走路快。如果骑车快,输出一行”Bike”;如果走路快,输出一行”Walk”;如果一样快,输出一行”All”。

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

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

【输入样例】
120
【输出样例】
Bike
【答案&代码】

#include<stdio.h>
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=−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 对应的分段函数值:f(N)。结果保留到小数点后三位。

【输入样例】
1.0
【输出样例】
1.500
【答案&代码】

#include<stdio.h>
int main(void){
    double x;
    scanf("%lf",&x);
    double y;
    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克), 基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。

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

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

【输入样例】
1200 y
【输出样例】
17
【答案&代码】

#include<stdio.h>
#include<math.h>
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<stdio.h>
#include<algorithm>
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<stdio.h>
#include<algorithm>
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年是闰年输出Y,否则输出N。

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

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

【输入样例】
2006
【输出样例】
N
【答案&代码】

#include<stdio.h>
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)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。如果点在正方形内,则输出yes,否则输出no。

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

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

【输入样例】
1 1
【输出样例】
yes
【答案&代码】

#include<stdio.h>
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的情况,则输出:Divided by zero!

  2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!

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

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

  1. 如果出现除数为0的情况,则输出:Divided by zero!

  2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!

【输入样例】
1 2 +
【输出样例】
3
【答案&代码】

#include<stdio.h>
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 : 求一元二次方程

【题目描述】
  求一元二次方程ax2+bx+c=0的根,其中a不等于0。结果要求精确到小数点后5位。

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

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

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

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

  若无实根输出“No answer!”。

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

【输入样例】
-15.97 19.69 12.02
【输出样例】
x1=-0.44781;x2=1.68075
【答案&代码】

#include<stdio.h>
#include<math.h>
#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;
}