Posted on 

Openjudge程序设计实习MOOC 程序设计与算法(三) 编程题

第三章 分支语句与循环语句

013. 求一元二次方程的根

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

输入:

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

输出:

输出一行,表示方程的解。
若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=…。
若b2 > 4 * a * c,则两个实根不等,则输出形式为:x1=…;x2 = …,其中x1>x2。
若b2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2a), 虚部 = sqrt(4ac-bb) / (2*a)

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<stdio.h>
#include<math.h>

int main(void) {
float a,b,c;
scanf("%f %f %f", &a,&b,&c);
int n = b * b - 4 * a * c;
if (n > 0)
{
double x1 = (-b + sqrt(b*b-4*a*c))/(2*a);
double x2 = (-b - sqrt(b*b-4*a*c))/(2*a);
if (b == 0) {
// 防止输入b=0
double x1 = sqrt(b*b-4*a*c)/(2*a);
double x2 = -sqrt(b*b-4*a*c)/(2*a);
}
printf("x1=%.5lf;x2=%.5lf", x1,x2);
}
else if (n < 0)
{
double x_real = (-b) / (2*a);
if (x_real == -0) {
// 同上
x_real = 0;
}
double x_imag = (sqrt(-b*b+4*a*c)) / (2*a);
printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi", x_real,x_imag,x_real,x_imag);
}
else if (n == 0)
{
double x = -b / (2*a);
printf("x1=x2=%.5lf", x);
}
return 0;
}

016.简单计算器

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

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

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

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
#include<stdio.h>

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

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

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

输入:一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。

输出:输出一行,表示序列的最大跨度值。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<stdio.h>
#include<cstring>

int main() {
int n,x,top=0,bottom=1000; // 定义一个“无效”的最值 再将每个值加入运算 改变最值
cin >> n;
for (int i=0; i<n; i++) {
cin >> x;
if (x>top) top=x;
if (x<bottom) bottom=x;
}
cout << top-bottom << endl;
return 0;
}

021.鸡尾酒疗法

鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(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。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<iostream>

int main(void) {
int n;
double a,b;
scanf("%d", &n);
scanf("%lf%lf", &a,&b);
double datum = b/a;
for (int i=0; i<n-1; ++i) {
double x,y;
scanf("%lf %lf", &x,&y);
double data = y / x;
if (data-datum>0.05) printf("better\n");
else if (datum-data>0.05) printf("worse\n");
else printf("same\n");
}
return 0;
}