【分支综合练习】

题目一:计算邮资

描述

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

输入描述

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

输出描述

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

用例输入 1 

1200 y

用例输出 1 

17

题目思路:

可以首先判断,是否加急,比一个一个去判断要简洁方便。是就+5

之后判断是否小于1000,是就在以上判断完毕的基础上+8;

之后判断>1000的,分为两种情况:

第一种情况:

能整除500的,直接乘以4

第二种情况:

不能整除500的,不能整除500的,整除后除以4,多出来的部分+4元

错误代码:

#include<iostream>
using namespace std;

int main() {
    int a,s=0;
    char c;
    cin>>a>>c;
    if(c=='y') s+=5;
    if(a<1000) s+=8;
    if(a>=1000)
    {
        if((a-1000)/500==0) s+=(a-1000)/500*4;
        else if((a-1000)/500!=0) s+=(a-1000)/500*4+4;
    }
    cout<<s;
    return 0;
}

正确代码: 

#include<iostream>
using namespace std;

int main() {
    int a,s=0;
    char c;
    cin>>a>>c;
    if(c=='y') s+=5;
    if(a<=1000) s+=8;
    else if(a>1000)
    {
        if((a-1000)%500==0) s+=8+(a-1000)/500*4;
        else if((a-1000)%500!=0) s+=8+(a-1000)/500*4+4;
    }
    cout<<s;
	return 0;
}

错误原因:

没有加上1000克时的八元

题目二:求四个数的最大数

描述

已知有四个不等的数,将其中的最大数找出来。

输入描述

输入只有一行,包括4个整数。之间用一个空格分开。

输出描述

输出只有一行(这意味着末尾有一个回车符号),包括1个整数。

用例输入 1 

1 9 8 6

用例输出 1 

9

方法:打擂台法

#include<iostream>
using namespace std;

int main() {
	int a,b,c,d,max;
    cin>>a>>b>>c>>d;
    max = a;
    if(b>max) max = b;
    if(c>max) max =c;
    if(d>max) max = d;
    cout<<max;
    return 0;
}

题目三:能否构成直角三角形

描述

判定三条线段a,b,c能否构成一个直角三角形。如果能构成,请计算出面积(保留一位小数),不然输出’No’。

输入描述

一行,三个整数。

输出描述

面积(保留一位小数) 或 No

用例输入 1 

3 4 5

用例输出 1 

6.0

来源

分支问题

题目分析:

直角三角形的判断条件:

判定1:有一个角为90°的三角形是直角三角形。

判定2:若a²+b²=c²的平方,则以a、b、c为边的三角形是以c为斜边的直角三角形(勾股定理的逆定理)。

判定3:若一个三角形30°内角所对的边是某一边的一半,那么这个三角形是以这条长边为斜边的直角三角形。

方法一:数组

#include<iostream>
#include<algorithm>
using namespace std;
double a[4];//定义一维数组
int main() {
	cin >> a[1] >> a[2] >> a[3];//输入三条边
    sort(a + 1, a + 4);//将三条边的大小进行排序
    if(a[1] * a[1] + a[2] * a[2] == a[3] * a[3]){//如果符合直角三角形的条件
        printf("%.1lf",a[1] * a[2] / 2.0);
    }
    else{
        cout << "No";
    }
    return 0;
}

方法2:

#include<iostream>
using namespace std;

int main() {
	int a,b,c;
    double s;
     cin>>a>>b>>c; if(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b){
        if(c>a&&c>b) printf("%.1lf",a*b/2.0);
        else if(a>b&&a>c) printf("%.1lf", b*c*1.0/2);
        else if(b>c&&b>a) printf("%.1lf", s=c*a*1.0/2);

}else cout<<"No";
    return 0;
}

题目三:做纸箱最少需要多少面积的硬纸板

描述

请问做一个尺寸为 a * b * c (单位:厘米)的开口的立方体纸箱(只有一个面是不需要封的,其余5个面都需要封起来,这样算开口的),最少需要多少平方厘米的纸。

输入描述

三个整数:a b c

输出描述

制作该纸箱需要的最少硬纸板的面积,一个整数。

用例输入 1 

5 3 4

用例输出 1 

74

来源

分支问题

题目分析:

用所有的面积,减去最大的面积,就是所需要的最少的面积

解法一:通过总面积减去最大的面积

#include<iostream>
using namespace std;

int main() {
	int a,b,c,s;
    cin>>a>>b>>c;
	s=2*(a*b+a*c+b*c);
    if(a<b && a<c){
        cout<<s-b*c;
    }else if(b<a && b<c){
        cout<<s-a*c;
    }else{
        cout<<s-a*b;
    }
    return 0;
}

解法二:用max函数,比较哪个面积最大

#include<iostream>
using namespace std;

int main() {
	int a,b,c;
    cin>>a>>b>>c;
    int s1=a*b;//15
    int s2=a*c;//20
    int s3=b*c;//12
    int max1=max(s1,s2);
    max1=max(max1,s3);
    cout<<(s1+s2+s3)*2-max1;
    return 0;
}

解法三:利用数组和sort排序函数

#include<iostream>
#include<algorithm>
using namespace std;
double a[4];
int main() {
	cin >> a[1] >> a[2] >> a[3];
    sort(a + 1, a + 4);
    cout << 2 * (a[1] * a[2] + a[1] * a[3] + a[2] * a[3]) - a[3] * a[2];
    return 0;
}

判断三个整数是否相邻

描述

判断三个整数是否相邻,是输出"TRUE",否则输出"FALSE"。

输入描述

输入只有一行,包括3个整数。

输出描述

输出只有一行。

用例输入 1 

1 3 2

用例输出 1 

TRUE

提示

三个整数不一定是有序的,例如:1 3 2,是相邻的数!

解法一:逻辑运算符

#include<iostream>
using namespace std;

int main() {
	int a,b,c;
    cin>>a>>b>>c;
    if((a-b==1&&b-c==1)||(b-a==1&&a-c==1)||(b-c==1&&c-a==1)||(c-b==1&&b-c==1)||(a-c==1&&c-b==1)||(c-a==1&&a-b==1))
        cout<<"TRUE";
    else cout<<"FALSE";
    return 0;
}

解法二:数组 sort排序

#include<iostream>
#include<algorithm>
using namespace std;
int a[4];
int main() {
	cin >> a[1] >> a[2] >> a[3];
    sort(a + 1, a + 4);
    if(a[3] - a[2] == 1 && a[2] - a[1] == 1){
        cout << "TRUE";
    }
    else{
        cout << "FALSE";
    }
    return 0;
}

解法三:swap()交换

#include<iostream>
using namespace std;

int main() {
	int a, b, c;
    cin >> a >> b >> c;
    if(a > b){
		swap(a, b);
    }
    if(b > c){
		swap(b, c);
    }
    if(a > b){
        swap(a, b);
    }
    if(c - b == 1 && b - a == 1){
        cout << "TRUE";
    }
    else{
        cout << "FALSE";
    }
    return 0;
}

解法4:利用第三个变量

#include<iostream>
using namespace std;
 
int main(){
	int a,b,c;
	cin>>a>>b>>c;
	if (a>b) { int t=a; a=b; b=t; }
	if (a>c) { int t=a; a=c; c=t; }
	if (b>c) { int t=b; b=c; c=t; }
	if (a+1==b && b+1==c) cout<<"TRUE\n";
	else cout<<"FALSE\n";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值