注意点,数据类型用long,判断分数小于0不要用a*b<0,要用(a>0&&b<0)||(a<0&&b>0),否则会溢出
#include<cstdio> #include<vector> #include<cstring> #include<iostream> using namespace std; long gcd(long a,long b){ if(b==0)return a; return gcd(b,a%b); } string func(long a, long b){ string str=""; bool flag=false; if(b==0){ str=str+"Inf"; return str; } if((a<0&&b>0)||(a>0&&b<0)){ flag=true; str+='('; } if(a==0) str+='0'; else{ if(flag)str+='-'; if(a/b*b==a){ str+=to_string(abs(a/b)); } else{ int z=a/b; a=a-z*b; if(z!=0){ str+=to_string(abs(z)); str+=' '; } long k=gcd(abs(a),abs(b)); str+=to_string(abs(a)/k); str+='/'; str+=to_string(abs(b)/k); } } if(flag)str+=')'; return str; } int main(){ long a,b,c,d; scanf("%ld/%ld %ld/%ld",&a,&b,&c,&d); bool flag1=true,flag2=true; string s1=func(a,b); string s2=func(c,d); char cal[4]={'+','-','*','/'}; long ans1[4]={0}; long ans2[4]={0}; for(int i=0;i<4;i++){ switch(cal[i]){ case '+':{ ans1[i]=a*d+b*c; ans2[i]=b*d; break; } case '-':{ ans1[i]=a*d-b*c; ans2[i]=b*d; break; } case '*':{ ans1[i]=a*c; ans2[i]=b*d; break; } case '/':{ ans1[i]=a*d; ans2[i]=b*c; break; } default:break; } string s=func(ans1[i],ans2[i]); cout<<s1; printf(" %c ",cal[i]); cout<<s2; printf(" = "); cout<<s<<endl; } return 0; }