这道题改了很多遍,一直有运行超时和答案错误,后来把别人的求最大公因数的程序拷贝过来就对了,但还是不知道是什么原因。
浮点数错误的原因是当x为0时求x和y的最大公因数过程中 y%x 会出现错误,也就是输出0的情况
20分。
#include<iostream>
using namespace std;
最大公约数和最小公倍数
//long gcd(long a,long b){
// if(a<b){
// int temp=a;
// a=b;
// b=temp;
// }
// if(b==0){
// return a;
// }
// else{
// return gcd(b,a%b);
// }
//}
void gcd(long int &a,long int &b){//直接修改a和b的值
long int r;
long int M = max(a,b), m = min(a,b);
while(r=M%m){
M=m;
m=r;
}
a/=m;
b/=m;
}
// 将两个分数相加 ,x,y为相加结果的分子分母 ,inter为整数部分
void add(long x1,long y1,long &x2,long &y2){
x2=x2*y1+x1*y2;
y2=y2*y1;
}
int main(){
int n;
long sa,sb;
long xx,yy;
scanf("%d",&n);
scanf("%ld/%ld",&sa,&sb);
for(int i=1;i<n;i++){
scanf("%ld/%ld",&xx,&yy);
add(sa,sb,xx,yy);
sa=xx;
sb=yy;
}
if(xx==0){
printf("0\n");
}
else{
// int mid=gcd(xx,yy);
// xx/=mid;
// yy/=mid;
gcd(xx,yy);
if(n==1){
xx=sa,yy=sb;
}
// cout<<xx<<" "<<yy<<endl;
if(xx%yy==0){
printf("%ld\n",xx/yy);
}
else if(xx>yy){
printf("%ld %ld/%ld\n",xx/yy,xx%yy,yy);
}
else if(xx<yy){
printf("%ld/%ld\n",xx,yy);
}
}
}
14分 答案错误+运行超时
#include<iostream>
using namespace std;
//最大公约数和最小公倍数
long gcd(long a,long b){
if(a<b){
int temp=a;
a=b;
b=temp;
}
if(b==0){
return a;
}
else{
return gcd(b,a%b);
}
}
// 将两个分数相加 ,x,y为相加结果的分子分母 ,inter为整数部分
void add(long x1,long y1,long &x2,long &y2){
x2=x2*y1+x1*y2;
y2=y2*y1;
}
int main(){
int n;
long sa,sb;
long xx,yy;
scanf("%d",&n);
scanf("%ld/%ld",&sa,&sb);
for(int i=1;i<n;i++){
scanf("%ld/%ld",&xx,&yy);
add(sa,sb,xx,yy);
sa=xx;
sb=yy;
}
// cout<<xx<<" "<<yy<<endl;
if(xx==0){
printf("0\n");
}
else{
int mid=gcd(xx,yy);
xx/=mid;
yy/=mid;
// cout<<xx<<" "<<yy<<endl;
if(xx%yy==0){
printf("%ld\n",xx/yy);
}
else if(xx>yy){
printf("%ld %ld/%ld\n",xx/yy,xx%yy,yy);
}
else if(xx<yy){
printf("%ld/%ld\n",xx,yy);
}
}
}