Bootstrap

OpenJudge题解——1.4编程基础之逻辑表达式与条件分支


01:判断数正负

提示:见代码。

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

02:输出绝对值

提示:注意输出是保留两位小数。

#include <cstdio>
using namespace std;
int main(){
	float n;
	scanf("%f",&n);
	if(n>=0){
		printf("%.2f",n);
	}else{
		printf("%.2f",-1*n);
	}
	return 0;
}

03:奇偶数判断

提示:见代码。

#include <cstdio>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	if(n%2==0){
		printf("even");
	}else{
		printf("odd");
	}
	return 0;
}

04:奇偶ASCII值判断

提示:通过int(a)将字符a进行类型转换就能得到它的ASCII码。

#include <cstdio>
using namespace std;
int main(){
	char a;
	scanf("%c",&a);
	if(int(a)%2==0){
		printf("NO");
	}else{
		printf("YES");
	}
	return 0;
}

05:整数大小比较

提示:注意数据范围是-231 <= y < 231 ,比int的范围大了1位,使用long long不然会报错。

#include <cstdio>
using namespace std;
int main(){
	long long x,y;
	scanf("%lld%lld",&x,&y);
	if(x>y){
		printf(">");
	}else if(x<y){
		printf("<");
	}else{
		printf("=");
	}
	return 0;
}

06:判断是否为两位数

提示:两个条件需要用&&进行连接。

#include <cstdio>
using namespace std;
int main(){
	int a;
	scanf("%d",&a); 
	if(a>=10&&a<=99){
		printf("1");
	}else{
		printf("0");
	}
	return 0;
}

07:收集瓶盖赢大奖

提示:两个条件满足任意一个就可以了,所有使用||连接条件。

#include <cstdio>
using namespace std;
int main(){
	int a,b;
	scanf("%d%d",&a,&b); 
	if(a>=10||b>=20){
		printf("1");
	}else{
		printf("0");
	}
	return 0;
}

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

提示:int最大是11位数,所以开int就足够了。

#include <cstdio>
using namespace std;
int main(){
	int n;
	scanf("%d",&n); 
	if(n%3==0&&n%5==0){
		printf("YES");
	}else{
		printf("NO");
	}
	return 0;
}

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

提示:用if并列分别取余3、5、7会简单很多,不用一个一个去列举所有情况,注意3和5后面要加空格。

#include<cstdio>
using namespace std;
int main(){
	int a;
	scanf("%d",&a);
	if(a%3==0) printf("3 ");
	if(a%5==0) printf("5 ");
	if(a%7==0) printf("7");
	if(a%3!=0&&a%5!=0&&a%7!=0) printf("n");
	return 0;
} 

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

提示:注意是恰好有一门不及格(小于60)。

#include<cstdio>
using namespace std;
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	if(a<60&&b>=60 || a>=60&&b<60){
		printf("1");
	}else{
		printf("0");
	}
	return 0;
} 

11:晶晶赴约会

提示:见代码。

#include<cstdio>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	if(n==1||n==3||n==5){
		printf("NO");
	}else{
		printf("YES");
	}
	return 0;
} 

12:骑车与走路

提示:见代码。

#include<cstdio>
using namespace std;
int main(){
	float n,t1,t2;
	scanf("%f",&n);
	t1=n/3.0+27+23;
	t2=n/1.2;
	if(t1<t2){
		printf("Bike");
	}else if(t1>t2){
		printf("Walk");
	}else{
		printf("All");
	}
	return 0;
} 

13:分段函数

提示:见代码。

#include<cstdio>
using namespace std;
int main(){
	float x,y;
	scanf("%f",&x);
	if(x>=0&&x<5){
		y=-1*x+2.5;
	}else if(x>=5&&x<10){
		y=2-1.5*(x-3)*(x-3);
	}else if(x>=10&&x<20){
		y=x/2-1.5;
	}
	printf("%.3f",y);
	return 0;
}

14:计算邮资

提示:先设定变量n和变量t表示总运费和超重要计算的次数。因为不足500页要按500算,所以可以用ceil()函数进行向上取整。
注意:使用%c读取字符时,会读到空格或回车,所以像这类读单个字符的问题,优先创建字符数组,用%s读,然后通过%c输出单个字符。或者使用cin

#include<cstdio>
#include<math.h>
using namespace std;
int main(){
	int a,n,t;
	char b[10];
	scanf("%d%s",&a,&b);
	t=ceil((a-1000)*1.0/500);  //对超出的部分向上取整 
	n=8; //基础运费8元 
	if(t>=1) n=n+t*4;  
	if(b[0]=='y') n=n+5;
	printf("%d",n);
	return 0;
} 

15:最大数输出

提示:建立变量m用来存储当前最大的数。

#include<cstdio>
using namespace std;
int main(){
	int a,b,c,m;
	scanf("%d%d%d",&a,&b,&c);
	if(a>b) m=a;
	else m=b;
	if(c>m) m=c; 
	printf("%d",m);
	return 0;
} 

16:三角形判断

提示:三角形的任意两边之和都大于第三边,根据这个特性可以得到以下代码。

#include<cstdio>
using namespace std;
int main(){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if(a+b>c&&a+c>b&&b+c>a) printf("yes");
	else printf("no");
	return 0;
} 

17:判断闰年

提示:这题的提示不是很清晰,闰年分为普通闰年和世纪闰年。
普通闰年:年份是4的倍数,且不是100的倍数(如2020年)。
世纪闰年:年份是400的倍数(如2000年)。

#include<cstdio>
using namespace std;
int main(){
	int a;
	scanf("%d",&a);
	if(a%4==0&&a%100!=0||a%400==0) printf("Y");
	else printf("N");
	return 0;
} 

18:点和正方形的关系

提示:判断x,y的边界坐标就可以了。

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

19:简单计算器

提示:见代码。

#include<iostream>
using namespace std;
int main(){
	int a,b;
	char c;
	cin>>a>>b>>c;
	if(c=='+') cout<<a+b;
	else if(c=='-') cout<<a-b;
	else if(c=='*') cout<<a*b;
	else if(c=='/')
		if(b==0) cout<<"Divided by zero!";
		else cout<<a/b;
	else cout<<"Invalid operator!";
	return 0;
} 

20:求一元二次方程的根

提示:见代码。

#include <iostream>
#include <stdio.h>
#include <math.h> 
using namespace std;
int main(){
    double a,b,c,x;
    cin>>a>>b>>c;
    if(b*b==4*a*c)
        printf("x1=x2=%.5f",(-b+sqrt(b*b-4*a*c))/(2*a));
    else{
        if(b*b>4*a*c)
            printf("x1=%.5f;x2=%.5f",(-b+sqrt(b*b-4*a*c))/(2*a), (-b-sqrt(b*b-4*a*c))/(2*a));
        else{
            x=(-b/(2*a));
            if(x==-0.00000)
                x=0;
            printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi",x,(sqrt(4*a*c-b*b)/(2*a)),x,(sqrt(4*a*c-b*b)/(2*a)));
        }
    }
    return 0;
}

21:苹果和虫子2

提示:同样使用ceil进行向上取整,注意有测试点,是会把苹果吃完的,所以要考虑0的情况。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,x,y,e;
	cin>>n>>x>>y;
	e=ceil(y*1.0/x);
	if(n>e) cout<<n-e;
	else cout<<0;	 		
	return 0;
} 

以上为个人见解,欢迎指正!

;