1034 有理数四则运算 测试点2、3 辗转相除法
易错点
测试点2、3:要用long long,同时这两个点卡求gcd的运行时间,因此需要熟练掌握求gcd的辗转相除法的代码
int gcd(int a,int b){//求最大公约数,辗转相除法
if(a<0){
a=-a;
}
if(b<0){
b=-b;
}
if(b==0){
return a;
}
else{
return gcd(b,a%b);
}
}
测试点3:分子分母同为负数的情况
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
long long find_c(long long a,long long b){
long long c;
if(a<0){
a=-a;
}
if(b<0){
b=-b;
}
// if(a<b){
// c=a;
// a=b;
// b=c;
// }
// for(int i=b;i>=1;i--){
// if(a%i==0&&b%i==0){
// return i;
// }
// }
if(b==0){
return a;
}
else{
return find_c(b,a%b);
}
}
void print_diy(long long a,long long b){
if(a>0&&b<0){
a=-a;
b=-b;
}
long long tmp,tmp2,tmp3;
tmp=(a);
tmp2=(b);
if(b==0){
cout<<"Inf";
}
else if(a==0){
cout<<"0";
}
else{
if(tmp<0&&tmp2<0){
tmp=-tmp;
tmp2=-tmp2;
}
while(find_c(tmp,tmp2)!=1){
tmp3=find_c(tmp,tmp2);
tmp/=tmp3;
tmp2/=tmp3;
}
if(abs(tmp)<=abs(tmp2)){
if(tmp2==1){
if(tmp*tmp2<0){
cout<<"("<<tmp<<")";
}
else{
cout<<tmp;
}
}
else{
if(tmp*tmp2<0){
cout<<"("<<tmp<<"/"<<tmp2<<")";
}
else{
cout<<tmp<<"/"<<tmp2;
}
}
}
else if(abs(tmp)>abs(tmp2)){
if(tmp2==1){
if(tmp*tmp2<0){
cout<<"("<<tmp<<")";
}
else{
cout<<tmp;
}
}
else{
if(tmp*tmp2<0){
cout<<"("<<tmp/tmp2<<" "<<abs(tmp)%abs(tmp2)<<"/"<<tmp2<<")";
}
else{
cout<<tmp/tmp2<<" "<<abs(tmp)%abs(tmp2)<<"/"<<tmp2;
}
}
}
}
}
int main()
{
string s1,s2,s3,s4;
long long a,b,c,d;
long long tmp,tmp2,tmp3;
getline(cin,s1,'/');
getline(cin,s2,' ');
getline(cin,s3,'/');
getline(cin,s4,'\n');
a=stoll(s1);
b=stoll(s2);
c=stoll(s3);
d=stoll(s4);
print_diy(a,b);
cout<<" + ";
print_diy(c,d);
cout<<" = ";
print_diy(a*d+b*c,b*d);
cout<<endl;
print_diy(a,b);
cout<<" - ";
print_diy(c,d);
cout<<" = ";
print_diy(a*d-b*c,b*d);
cout<<endl;
print_diy(a,b);
cout<<" * ";
print_diy(c,d);
cout<<" = ";
print_diy(a*c,b*d);
cout<<endl;
print_diy(a,b);
cout<<" / ";
print_diy(c,d);
cout<<" = ";
print_diy(a*d,b*c);
cout<<endl;
return 0;
}

浙公网安备 33010602011771号