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
分析与答案
和前面的有理数加法是类似的,只是这里有多个有理数,而且有正有负。用两个数组分别表示分子和分母,再用两个变量分别表示结果的分子和分母,每次加法操作之前先判定两个加数的分母是否相同,相同则分子相加,不相同则先化简两个分数,再使用公式相加。对结果的分母乘以输入的有理数个数(相当于整体求平均)再进行化简,如果化简结果里分母为1,则只输出分子,否则以分数形式输出。
#include <stdio.h>
void sim(int* up,int* down);
int main(){
int num;
scanf("%d",&num);
int up[100]={0},down[100]={0};
for(int i=0;i<num;i++){
scanf("%d/%d",&up[i],&down[i]);
getchar();
}
int a1=up[0],b1=down[0],a2=up[1],b2=down[1];
int *res_up = &a1,*res_down = &b1;
for(int i=1;i<num;i++){
if(b1!=b2){
sim(&a1,&b1);
sim(&a2,&b2);
a1=a1*b2+a2*b1;
b1=b1*b2;
}
else
a1 = a1+a2;
//sim(res_up,res_down);
a2=up[i+1];
b2=down[i+1];
}
*res_down *= num;
sim(res_up,res_down);
if(*res_down == 1)
printf("%d",*res_up);
else
printf("%d/%d",*res_up,*res_down);
return 0;
}
void sim(int *up,int *down){
int upIsNegative = 0,downIsNegative = 0;
if(*up<0){
upIsNegative = 1;
*up = - *up;
}
if(*down<0){
downIsNegative = 1;
*down = - *down;
}
if(*up%*down == 0){
//printf("%d",up/down);
*up /= *down;
*down = 1;
}
else{
int i = *down>*up?*up:*down;
while(i!=1 && *up!=1){
if(*up%i == 0 && *down%i == 0){
*up /= i;
*down /=i;
}
i--;
}
//printf("%d/%d",up,down);
}
if((upIsNegative && !downIsNegative)||(!upIsNegative && downIsNegative)){
*up = -*up;
}
}