C语言每日一题-PTA-基础编程题-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

#include 
#include 
#include 
#include 
typedef struct Adate
{
	int a;//分子
	int b;//分母 
} Youlishu; 

int computgys(int a,int b);
void computsum(Youlishu *num1,Youlishu *num2,int*sum_a,int*sum_b);
int main() {
    
    int N=0;
scanf("%d",&N);
Youlishu num[N]; 
int i=0;
for(;i<N;i++)//读入N个分数形式的有理数 
{
	scanf("%d/%d",&num[i].a,&num[i].b);
}
//计算N个有理数的平均值
int sum_a=0;
int sum_b=0;
//先计算有理数之和 
for(i=1;i<N;i++)
{
	if(i>1)
	{
		num[i-1].a=sum_a;
		num[i-1].b= sum_b; 
	}	
	//调用函数计算两个有理数之和:传入 num[i-1] num[i],返回 sum_a, sum_b
	Youlishu *n1=&num[i-1];
	Youlishu *n2=&num[i];
	computsum(n1,n2,&sum_a,&sum_b);
}
int average_a=0;
int average_b=0;
average_a=sum_a;
average_b=sum_b*N;
int a=computgys(average_a,average_b);//计算最大公约数 
if(a!=0)
{
	average_a=average_a/a;//简化 
	average_b=average_b/a; 
}
if(average_b==1)//分母为1 
printf("%d",average_a);
else if(average_a==0) //分子为0
printf("%d",0) ;
else
printf("%d/%d",average_a,average_b);

    return 0;

}
void computsum(Youlishu *num1,Youlishu *num2,int*sum_a,int*sum_b)//传入结构体的数据,一般都是传入结构体的指针而不是直接传入整个结构体 
{
	int 	a1=num1->a;//通过结构体指针指向成员的时候使用-> 
	int 	b1=num1->b;
	int 	a2=num2->a;
	int 	b2=num2->b;
	//若不随时简化则会溢出
	int k1=computgys(a1,b1);
	if(k1!=0)
	{
		a1=a1/k1;
		b1=b1/k1;
	}
	int k2=computgys(a2,b2);
	if(k2!=0)
	{
		a2=a2/k2;
		b2=b2/k2;
	}		
	//分母都为正,分子可能为负 
	//先把分子分母乘一个数,使得分母相同,再把分子相加,再对之后的分母分子进行约分 
	//先求两个分母:b1 b2的最小公倍数:最小公倍数=两数的乘积/最大公约(因)数 
	//1、求b1 b2的最大公约数 	
	int a=computgys(b1,b2);
	//2、求 b1 b2的最小公倍数 
	int min_gongbeishu=b1*b2/a;
	//3、将a1/b1、a2/b2变成分母相同的有理数 
	int change1=0,change2=0;
	change1=min_gongbeishu/b1;
	a1=a1*change1;
	change2=min_gongbeishu/b2;
	a2=a2*change2;
	b1=min_gongbeishu;
	b2=min_gongbeishu;
	//4、将分子相加再约分 进行简化 
	*sum_a=a1+a2;
	*sum_b=min_gongbeishu;
	int m=computgys(*sum_a,*sum_b);
	if(m!=0)
	{
		*sum_a=*sum_a/m;
		*sum_b=*sum_b/m;
	}			
 } 
int computgys(int a,int b)
{
	while(b!=0)
{
	int yushu=a%b;
	a=b;
	b=yushu;	
}
	return a;
}


你可能感兴趣的:(C语言学习-基础编程题,c语言,指针)