7-50 有理数均值 (20分)

本题要求编写程序,计算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

知识点

学习的博文:双解法
C++中int a[10]和int* a=new int[10]]有什么区别 :
博文

if(n==1&&arr[0].mol==0){//如果输入一个且分子为0 
		cout<<0;
		return 0;
	}
if(summol==0){  //防止浮点错误!! 
		cout<<0;
		return 0;
	}

动态规划

#include<iostream>
using namespace std;

int main(){
	int n;
	cin>>n;
	int *a=new int[n];//分子 
	int *b=new int[n];//分母 
	char c;
	for(int i=0;i<n;i++){
		cin>>a[i]>>c>>b[i];
	}
	int zi=a[0],mu=b[0];  //初始化分子、分母
	for(int i=1;i<n;i++){
		zi=zi*b[i]+a[i]*mu; //分子*分母+分子*分母 
		mu*=b[i]; //同分迭代 
	} 
	deno*=n; //求平均值,分母乘以个数
	if(zi==0){
		cout<<0;
		return 0;
	} 
	int A=zi,B=mu,r; //保留分子、分母,定义余数
	while(B){
		r=A%B;
		A=B;
		B=r;
	}  //求两数最大公约数
	cout<<zi/A;
	if(mu/A!=1){
		cout<<'/'<<mu/A;
	} 
}

普通代码

#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b);

int n;
ll sumdem=1;
ll summol=0;

struct node
{
	int mol;//分子的英文molecules
	int dem;//分母的英文 
	
}arr[100];

int main(){
	cin>>n;
	
	
	for(int i=0;i<n;i++){
		scanf("%ld/%ld",&arr[i].mol,&arr[i].dem);
	}
	if(n==1&&arr[0].mol==0){//如果输入一个且分子为0 
		cout<<0;
		return 0;
	}
	
	
	for(int i=0;i<n;i++){
		sumdem*=arr[i].dem;
	}
	for(int i=0;i<n;i++){
		summol+=sumdem/arr[i].dem*arr[i].mol;
	}
	if(summol==0){  //防止浮点错误!! 
		cout<<0;
		return 0;
	}
	
	
	int maxgcd=gcd(summol,sumdem);
	summol/=maxgcd;  //2
	sumdem/=maxgcd;  //6
	
	sumdem*=n;
	maxgcd=gcd(summol,sumdem);
	summol/=maxgcd;  
	sumdem/=maxgcd; 
	if(sumdem==1){
		cout<<summol;
	} 
	else{
		cout<<summol<<"/"<<sumdem;
	}
}

ll gcd(ll a, ll b){ //求最大公约数
	if(a<b){
		ll t=a;
		a=b;
		b=t;
	}
	//a > b;
	ll c=a%b;
	if(c==0){
		return b;
	}
	while(c){
		a=b;
		b=c;
		c=a%b;
	}
	return b;
} 

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDouble-

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值