这道题想了好久,一晚上加一早上,第三个点愣是没过,查阅众多博客,不是改为long long就是负负得正,但是改了后第三个还是答案错误,最后想了一下是不是相乘溢出的原因,然后在乘法和除法的前面加上约分:代码如下
long long gcd=__gcd(m1,d1);//求公约数
if(gcd!=1){
m1/=gcd;
d1/=gcd;
}
gcd=__gcd(m2,d2);//求公约数
if(gcd!=1){
m2/=gcd;
d2/=gcd;
}
没想到居然真的过了:正确代码如下:
#include<bits/stdc++.h>
using namespace std;
long long m1,d1;
long long m2,d2;
// 打印分数
void printGrade(long long a,long long b){//a为分子,b为分母
bool flag=false;
// cout<<endl<<a<<b<<endl;
if(a<0){
if(b<0){
a=-a;
b=-b;
}else{
cout<<"(-";
a=-a;
flag=true;
}
}else{
if(b<0){
cout<<"(-";
b=-b;
flag=true;
}
}
long long gcd=__gcd(a,b);//求公约数
if(gcd!=1){
a/=gcd;
b/=gcd;
}
if(a==0){//分子为0
cout<<0;
return;
}else if(b==1){
cout<<a;
if(flag)cout<<')';
return;
}else if(b==0){
cout<<"Inf";
return;
}else if(a==b){
cout<<a/b;
if(flag)cout<<')';
return;
}else if(a>b){
cout<<(a/b)<<' '<<(a%b)<<'/'<<b;
if(flag)cout<<')';
return;
}else{
if(flag){
cout<<a<<'/'<<b<<")";
}else
cout<<a<<'/'<<b;
}
}
//分数相加
void add(){
long long temp=m1+m2;
printGrade(temp,d1);
// cout<<"*"<<temp<<d1;
}
//分数相减
void sub(){
long long temp=m1-m2;
printGrade(temp,d1);
}
//分数相乘
void mul(){
long long tempM=m1*m2;
long long tempD=d1*d2;
printGrade(tempM,tempD);
}
//分数相除
void div(){
if(m2==0){//考虑倒数的分母为0的情况
cout<<"Inf";
return;
}
if(m2<0){
m2=-m2;
d2=-d2;
}
long long tempM=m1*d2;
long long tempD=d1*m2;
printGrade(tempM,tempD);
}
int main(){
scanf("%lld/%lld%lld/%lld",&m1,&d1,&m2,&d2);
m1*=d2;
m2*=d1;
d1*=d2;
d2=d1;
printGrade(m1,d1);
cout<<" + ";
printGrade(m2,d2);
cout<<" = ";
add();
cout<<endl;
printGrade(m1,d1);
cout<<" - ";
printGrade(m2,d2);
cout<<" = ";
sub();
cout<<endl;
long long gcd=__gcd(m1,d1);//求公约数
if(gcd!=1){
m1/=gcd;
d1/=gcd;
}
gcd=__gcd(m2,d2);//求公约数
if(gcd!=1){
m2/=gcd;
d2/=gcd;
}
printGrade(m1,d1);
cout<<" * ";
printGrade(m2,d2);
cout<<" = ";
mul();
cout<<endl;
printGrade(m1,d1);
cout<<" / ";
printGrade(m2,d2);
cout<<" = ";
div();
cout<<endl;
return 0;
}
总结可能原因:因为我在运算前通了分,然后导致分子或分母超过了整数范围,乘法或除法再相乘的结果是可能会大于long long的最大值的。