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