目录
代码:
#include<iostream>
using namespace std;
#define ll long long int
ll gcd(ll a,ll b);
int main(){
//思路:
//要求和,分母要通分,分子要通分,分子相加,再输出
//在存储的同时计算最大公因数,然后计算最小公倍数
//求分子和
//分情况输出
ll n;
cin>>n;
ll a[n],b[n];//用来存储分子和分母
ll c;//用来记录最小公倍数
//先给值以初始化
cin>>a[0];
cin.ignore();//
cin>>b[0];
c=b[0];
for(int i=1;i<n;i++){
cin>>a[i];
cin.ignore();
cin>>b[i];
c*=b[i]/gcd(c,b[i]);//
}
//求通分后分子和
ll d=0;//分子和
for(int i=0;i<n;i++){
d=d+a[i]*(c/b[i]);
}
//输出
if(d%c==0){//整除
cout<<d/c<<endl;
}
else if(d/c==0){//小于1
cout<<d/gcd(d,c)<<"/"<<c/gcd(d,c)<<endl;
}
else{//大于1
cout<<d/c;
cout<<" ";
d=d-c*(d/c);
cout<<d/gcd(d,c)<<"/"<<c/gcd(d,c)<<endl;
}
return 0;
}
ll gcd(ll a,ll b){//用辗转相除法求最大公因数
return b == 0 ? a : gcd(b,a%b);
}
讲解:
1.选何种数据结构?
在我还不知道有ignore()这个函数时,我打算用string字符串存储,但这样需要写很多判断同时不方便计算。
2.求和?
在储存过程中求最小公倍数,这样可以省掉O(n)的时间,然后在通分的同时求分子和。节省时间和一个变量(哈哈哈,节省一个变量,真有病)。
3.输出?
分情况讨论就好,注意约分。
4.辗转相除法
求最大公因数的算法,应该要知道的。
提出一个问题:
如果要用VS运行这个程序,定义数组的时候必须用常量,该如何解决呢?