个人观点,如有不同见解,欢迎留言
题目:
本题要求编写程序,计算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<iostream>
#include<cmath>
#define len 20
int LCM(int x,int y);
int GCD(int x,int y);
using namespace std;
int main() {
int n;
cin>>n;
char a[n][len];
int num[n][2]= {0},lcm=1,numerator=0,lcm_;
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=0; i<n; i++) { //将字符串转化为分子和分母
for(int j=0; a[i][j]!=' '; j++) {
if(a[i][j]=='/') {
int flag=1;
if(a[i][0]=='-') {
for(int k=j-1; k>0; k--) {
num[i][0]+=(a[i][k]-'0')*flag;
flag*=10;
}
num[i][0]=-num[i][0];
} else {
for(int k=j-1; k>=0; k--) {
num[i][0]+=(a[i][k]-'0')*flag;
flag*=10;
}
}
}
if(a[i][j+1]==' ') {
int flag=1;
for(int k=j; a[i][k]!='/'; k--) {
num[i][1]+=(a[i][k]-'0')*flag;
flag*=10;
}
}
}
}
if(n==1) {
int temp3=GCD(num[0][0],num[0][1]);
num[0][0]/=temp3;
num[0][1]/=temp3;
//cout<<temp3<<"***";
numerator=num[0][0];
lcm=num[0][1];
//cout<<num[0][0]<<"**"<<num[0][1]<<"***";
} else {
for(int i=0; i<n-1; i++) { //求分母最小公倍数(lcm)
if(lcm%num[i+1][1]!=0) {
lcm=LCM(num[i][1],num[i+1][1]);
}
}
for(int i=0; i<n; i++) { //求通分后的分子(numerator)
numerator+=lcm/num[i][1]*num[i][0];
}
lcm*=n;
int temp1=GCD(abs(numerator),lcm); //分子分母化简
numerator/=temp1;
lcm/=temp1;
}
cout<<numerator;
if(lcm!=1)
cout<<"/"<<lcm;
}
int LCM(int x,int y) { //求两个数最小公倍数
return x*y/GCD(x,y);
}
int GCD(int x,int y) { //求两个数最大公约数
int x_temp=x,y_temp=y;
while(1) {
if(!y)
break;
else {
int temp=x%y;
x=y;
y=temp;
}
}
return x;
}
注:
一个测试点没过