头歌C语言实验 练习6:循环结构II

第1关:分数序列和

问题描述
有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,…… ,求这个分数序列的前n项之和。

输入
输入只有一个非负整数n(0≤n≤500)。

输出
按照“分数序列前x项之和为:y”的格式输出前n项的和,其中x为项数n,y是前n项之和,保留4位小数,冒号是中文的冒号。

输入示例
99

输出示例
分数序列前99项之和为:160.4849

提示
为避免溢出错误,在程序中的中间变量尽可能都使用double类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(){
int i,n;
double sum=0;
double a=2,b=1;
scanf("%d",&n);
if(n!=0){
sum=a/b;
if(n>=2){
for(i=1;i<n;i++){
a=a+b;
b=a-b;
sum+=a/b;
}
}
}
printf("分数序列前%d项之和为:%.4lf",n,sum);
return 0;
}

第2关:奖金发放

问题描述
企业每个月发放的奖金根据当月利润进行提成。利润I低于或等于10万元(I≤100000)时,奖金可提10%;利润高于10万元,低于20万元(100000<I≤200000)时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;200000<I≤400000时,低于20万元的部分仍按上述办法提成(下同)。高于20万的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000<I≤1000000时,高于60万元的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。
聪明的你能编写一段程序,根据一年中每个月的利润,计算并输出这一年内的应发奖金总额吗?

输入
输入数据一共有12行,每一行都是一个正整数,其中第i(1≤i≤12)行的整数表示第i个月的利润(以元为单位),其中每个整数都不超过2000000。

输出
输出只有一行,即该企业在这一年内应该发放的奖金总额(以元为单位),要求精确到小数点后两位。

输入示例
400000
106000
50000
580000
620000
1030000
1700000
122000
640000
76000
60000
540000

输出示例
287000.00

提示
为保证数据精度准确无误,涉及到实数的变量请使用double类型。
输入示例中,针对每个月的利润,对应每月计算的奖金是:
27500.00
10450.00
5000.00
32900.00
33800.00
39800.00
46500.00
11650.00
34100.00
7600.00
6000.00
31700.00

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 <stdio.h>
#include <math.h>
double sum(double n){
double t;
if(n/pow(10,4)<=10){
return n*0.1;
}else if(n/pow(10,4)<=20){
t=sum(pow(10,5));
return t+(n-pow(10,5))*0.075;
}else if(n/pow(10,4)<=40){
t=sum(2*pow(10,5));
return t+(n-2*pow(10,5))*0.05;
}else if(n/pow(10,4)<=60){
t=sum(4*pow(10,5));
return t+(n-4*pow(10,5))*0.03;
}else if(n/pow(10,4)<=100){
t=sum(6*pow(10,5));
return t+(n-6*pow(10,5))*0.015;
}else{
t=sum(10*pow(10,5));
return t+(n-10*pow(10,5))*0.01;
}
}
int main(){
int i;
double l[12];
double money=0;
for(i=0;i<12;i++){
scanf("%lf",&l[i]);
}
for(i=0;i<12;i++){
money+=sum(l[i]);
}
printf("%.2lf",money);
return 0;
}

第3关:成绩统计 II

问题描述
输入若干个百分制成绩,直到输入负数时为止。
请编写一段程序,统计出这些成绩的平均成绩和其中的不及格人数。

输入
若干个用空格分开的浮点数,最后是一个负数。除最后的负数外,之前的每个浮点数代表一个百分制成绩。

输出
输出共包括两行:
第一行输出全班同学的平均成绩,保留2位小数;
第二行输出不及格人数。
输出格式参照输出示例,注意其中的冒号是中文冒号。

输入示例
85.6 83.47 45.8 96.3 100 37.4 68.9 96.6 88 84.6 94.7 78.8 -2.3

输出示例
平均成绩:80.01分
不及格人数:2人

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

int main(){
int i=0,n=0;
double score,avg=0;
do{
scanf("%lf",&score);
if(score<0)
break;
n++;
avg+=score;
if(score<60)
i++;
}while(1);
avg/=n;
printf("平均成绩:%.2lf分\n不及格人数:%d人",avg,i);
return 0;
}

第4关:计算圆周率 I

问题描述
众所周知,可以使用级数展开公式近似计算圆周率π,下面的这个公式可以算是其中最简单的一个:
π/4=1-1/3+1/5-1/7+1/9-…
根据给定的正整数 n 使用上述公式通过计算前n项的和,近似计算圆周率π的值。

输入
一个正整数n。

输出
一个浮点数,表示圆周率π的近似值,精确到小数点后8位。

输入示例
5

输出示例
3.33968254

提示
为保证数据精度准确无误,涉及到实数的变量请使用double类型。

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

int main(){
int i,n;
double pi=0;
scanf("%d",&n);
for(i=0;i<n;i++){
pi+=4*(1/(2.0*(i+1)-1))*pow(-1,i);
}
printf("%.8lf",pi);
return 0;
}

第5关:最大公约数和最小公倍数

问题描述
最大公约数
也称为最大公因数或最大公因子,指两个或多个整数共有约数中最大的一个。
求最大公约数的方法有很多,现列举最常用的两种方法。

辗转相除法 设有两整数 a 和 b ,则计算步骤如下:
① 计算a和b的余数c;
② 若c为0,则b即为两数的最大公约数;
③ 若c不为0,则令a = b,b = c,再重复执行步骤①。
例如:求27和15的最大公约数过程为:
求27和15的余数为12
求15和12的余数为3
求12和3的余数为0
因此,3即为27和15的最大公约数。
2. 相减法
设有两整数 a 和 b ,则计算步骤如下:
① 若a大于b,则令a = a - b;
② 若a小于b,则令b = b - a;
③ 若a与b相等,则a(或b)即为两数的最大公约数;
④ 若a与b不相等,则重复执行步骤 ①。
例如:求27和15的最大公约数过程为:
(27 > 15)27 - 15 = 12
(12 < 15)15 - 12 = 3
(12 > 3)12 - 3 = 9
(9 > 3)9 - 3 = 6
(6 > 3)6 – 3 = 3
因为a和b的值都为3,因此3即为27和15的最大公约数。

最小公倍数
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
求最小公倍数算法:最小公倍数 = 两整数的乘积 ÷ 最大公约数。
请根据以上算法描述编写一段程序,计算并输出两个任意的正整数的最大公约数与最小公倍数。

输入
用空格分开的两个正整数a和b。

输出
输出用空格分开的两个正整数,第一个是最大公约数,第二个是最小公倍数。

输入示例
66 33

输出示例
33 66
下面有两种方法,任选其一即可

辗转相除法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int successive(int a,int b){
int c;
c=a%b;
if(c==0)
return b;
while(c!=0){
a=b;
b=c;
c=a%b;
}
return b;
}
int main(){
int a,b,multiple,divisor;
scanf("%d %d",&a,&b);
divisor=successive(a,b);
printf("%d ",divisor);
multiple=a*b/divisor;
printf("%d",multiple);
return 0;
}

相减法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int subtraction(int a,int b){
if(a>b)
a=a-b;
else if(a<b)
b=b-a;
else
return a;
if(a!=b)
return subtraction(a,b);
}
int main(){
int a,b,multiple,divisor;
scanf("%d %d",&a,&b);
divisor=subtraction(a,b);
printf("%d ",divisor);
multiple=a*b/divisor;
printf("%d",multiple);
return 0;
}