7-35 有理数均值
题目问题描述:
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …
的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b
的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
思路分析:
问题:
- 如何存储分子分母;
- 如何得到分子分母的总和;
- 如何得到最大公约数;
- 如何解决最大N;
解决:
- 定义结构体数组,存储每个数的分子和分母
- 分母总和=每个数的分母相互乘积;分子总和=其余数的分母乘积*分子的累加和;
- 利用辗转相除法求最大公约数;
- 加上分母总和等于0的判断即可排除分母为零的时的情况
实现代码:
#include<stdio.h>
struct shu{ //定义一个结构体用来存放分子分母
int fz;
int fm;
};
int main(){
int N;
int sumfz = 0; //分子的和
int sumfm = 1;//分母的和
int sum = 1; //每个分子需要乘的其他数的分母的乘积
int yue; //最大公约数
struct shu a[102];
scanf("%d",&N);
if(N == 0||N>100)//N 不在范围时,从新输入
scanf("%d",&N);
for(int i = 0;i < N;i++){ //输入分母、分子
scanf("%d/%d",&a[i].fz,&a[i].fm);
}
for(int j = 0;j< N;j++){
sumfm *= a[j].fm; //将每个分母相乘的到分母总和
for(int k = 0;k < N;k++){
if(j != k){
sum *=a[k].fm;//找到其他数分母的乘积
}
}
sumfz +=a[j].fz*sum; //分子的总和
sum = 1;
}
if(sumfz == 0){ //若分子总和为0时,输出0,解决除0的情况
printf("0");
return 0;
}
sumfm =sumfm*N;//求平均值,直接将N乘到分母总和上直接一起求最大公约数
yue = yue1(sumfz,sumfm); //求最大公约数
if(sumfz % sumfm == 0){
printf("%d",sumfz/sumfm);
}
else{
printf("%d/%d",sumfz/yue,sumfm/yue);
}
}
int yue1(int a,int b){ //辗转相除法求最大公约数
if(b == 0)
return 1;
int r = a %b;
while(r != 0){
a = b;
b = r;
r = a%b;
}
return b;
}