第三周测验

1. 奇偶数判断

描述

给定一个整数,判断该数是奇数还是偶数。

输入输入仅一行,一个大于零的正整数n。输出输出仅一行,如果n是奇数,输出odd;如果n是偶数,输出even。样例输入
5
样例输出
odd
来源

北京大学 计算概论 06

【思路】能否被2整除。

代码:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	if(n%2==0) cout << "even";
	else cout << "odd";
	return 0;
}

2. 求一元二次方程的根

描述

利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。

输入输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax 2 + bx + c =0的系数。输出输出一行,表示方程的解。
若b 2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=...。
若b 2 > 4 * a * c,则两个实根不等,则输出形式为:x1=...;x2 = ...,其中x1>x2。
若b 2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2*a), 虚部 = sqrt(4*a*c-b*b) / (2*a)

所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。样例输入
样例输入1
1.0 2.0 8.0

样例输入2
1 0 1
样例输出
样例输出1
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i

样例输出2
x1=0.00000+1.00000i;x2=0.00000-1.00000i
来源1709
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define EPS 1e-7
int main()
{
	double a,b,c;
	scanf("%lf%lf%lf",&a,&b,&c);
	double tmp = b*b - 4*a*c;
	if(tmp < EPS && tmp > -EPS)//相当于tmp==0
		printf("x1=x2=%.5lf",(-b)/(2*a)+EPS);//防止出现-0.00000的情况
	else if(tmp > EPS)//相当于tmp>0
	{
		double x1 = (-b + sqrt(tmp))/(2*a);
		double x2 = (-b - sqrt(tmp))/(2*a);
		if(x1-x2>EPS)
			printf("x1=%.5lf;x2=%.5lf",x1+EPS,x2+EPS);
		else
			printf("x1=%.5lf;x2=%.5lf",x2+EPS,x1+EPS);
	}
	else
	{
		double e = (-b)/(2*a);
		double f = sqrt(4*a*c-b*b)/(2*a);
		printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi",e+EPS,f+EPS,e+EPS,f+EPS);	
	}	
} 

【重点】1. 不能出现-0.00000的情况

2. 当tmp>0(或tmp>EPS时),要比较x1和x2的大小。

【特别注意】 

(-b)/(2*a)与(-b)/2*a运算顺序是不一样的,结果也不一样,这里错了很多遍

3. 点和正方形的关系

扫描二维码关注公众号,回复: 2163092 查看本文章
描述

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

输入输入一行,包括两个整数x、y,以一个空格分开,表示坐标(x,y)。输出输出一行,如果点在正方形内,则输出yes,否则输出no。样例输入
1 1
样例输出
yes
来源1856

【思路】x,y坐标的范围在【-1,1】之间。

#include<iostream>
using namespace std;
int main()
{
	int a,b;
	cin >> a >> b;
	if((a >= -1 && a <= 1 ) && (b >=-1 && b <=1)) 
		cout << "yes";
	else
		cout << "no";
	return 0; 
}

4. 苹果和虫子2

描述

你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果?

输入输入仅一行,包括n,x和y(均为整数)。输出输出也仅一行,剩下的苹果个数样例输入
10 4 9
样例输出
7
提示注意:是要求完整的苹果数。【思路】 一定要注意y/x+1的值大于n的情况,此时只能输出0.
#include<iostream>
using namespace std;
int main()
{
	int n, x, y;
	cin >> n >> x >> y;
	int s = y/x;
	if(y%x != 0) 
		s++;
	s = n - s;
	if (s < 0)  cout << "0";
	else 
		cout << s;	 
	return 0;
}

5. 简单计算器

描述

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

输入输入只有一行,共有三个参数,其中第1、2个参数为整数,第3个参数为操作符(+,-,*,/)。输出输出只有一行,一个整数,为运算结果。然而:
1. 如果出现除数为0的情况,则输出:Divided by zero!
2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!样例输入
1 2 +
样例输出
3
提示可以考虑使用if和switch结构。
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int a,b;
	char c;
	cin >> a >> b >> c;
	switch (c)
	{
		case '+':
			cout << a+b;
			break;
		case '-':
			cout << a-b;
			break;
		case '*':
			cout << a*b;
			break;
		case '/'://除法的时候记得要判断
			if(b==0)
				cout << "Divided by zero!";
			else
				cout << a/b;
			break;
		default:
			cout << "Invalid operator!";
		}
	return 0;
}

6. 求整数的和与均值

描述

读入n(1 <= n <= 10000)个整数,求它们的和与均值。

输入输入第一行是一个整数n,表示有n个整数。
第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。输出输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。样例输入
4
344
222
343
222
样例输出
1131 282.75000
来源习题(8-6)【重点】使用while循环时,到最后n=0了,所以求平均数的时候不能直接除以n。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n, m, sum=0, total;
	cin >> n;
	total = n;
	while(n--)
	{
		cin >> m;
		sum += m;
	}
	printf("%d %.5lf",sum,(double)sum/total);
	return 0;
}

7. 整数序列的元素最大跨度值


描述

给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值)。 

输入一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。输出输出一行,表示序列的最大跨度值。样例输入
6
3 0 8 7 5 9
样例输出
9
来源

改编自 元培-From Whf


#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n, a, maxn = 0, minn = 1100;//minn只需要保证比1000大即可
	cin >> n;
	for(int i = 1; i <= n; ++i)
	{
		cin >> a;
		if(a > maxn) maxn = a;
		if(a < minn) minn = a;
	}
	cout << maxn-minn;
	return 0;
}

8. 奥运奖牌计数

描述

2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。

输入输入n+1行,第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。输出输出1行,包括4个整数,为A国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。样例输入
3
1 0 3
3 1 0
0 3 0
样例输出
4 4 3 11
#include<iostream>
#include<cstdio>
int main()
{
	int n, a, b, c;
	scanf("%d",&n);
	int sum1, sum2, sum3, sum;
	sum1 = sum2 = sum3 = sum = 0;
	for(int i=1; i<=n; ++i)
	{
		scanf("%d%d%d", &a, &b, &c);
		sum1 += a;
		sum2 += b;
		sum3 += c; 
	}
	sum = sum1 + sum2 + sum3;
	printf("%d %d %d %d",sum1,sum2,sum3,sum);
	return 0;
}

9. 乘方计算

描述

给出一个整数a和一个正整数n,求乘方an

输入
一行,包含两个整数a和n。-1000000 <= a <= 1000000,1 <= n <= 10000。
输出
一个整数,即乘方结果。题目保证最终结果的绝对值不超过1000000。
样例输入
2 3
样例输出
8
【思路】a的n次方,就是n个a相乘,循环n次即可。
#include<iostream>
#include<cstdio>
int main()
{
	int a, n, q=1;
	scanf("%d%d", &a, &n);
	for(int i=1; i<=n; ++i)
	{
		q *= a;
	}
	printf("%d", q);
	return 0;
}

10. 鸡尾酒疗法

描述

鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于1996年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。该疗法的应用可以减少单一用药产生的抗药性,最大限度地抑制病毒的复制,使被破坏的机体免疫功能部分甚至全部恢复,从而延缓病程进展,延长患者生 命,提高生活质量。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式 进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给 出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。

输入
第一行为整数n( 1 < n <= 20);
其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。
这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。
输出
有n-1行输出,分别表示对应改进疗法的效果:
如果效果更好,输出better;如果效果更差,输出worse;否则输出same
样例输入
5
125 99
112 89
145 99
99 97
123 98
样例输出
same
worse
better
same

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n, a, b;
	cin >> n;
	cin >> a >> b;	
	double x = (double)b/a;//一定要记得在b或者a前加上double进行强制类型转换,否则b/a的结果一直为0
	for (int i=1; i<=n-1; ++i)
	{
		cin >> a >> b;
		double y = (double)b/a;
		if((y-x)>0.05) cout << "better" << endl;
		else if((x-y)>0.05) cout << "worse" << endl;
		else cout << "same" << endl;
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/yanyanwenmeng/article/details/81012545