✨难点在于 1、输出格式要考虑全面,尤其是有负号的时候
2、当进行分数除法时,第二个数的 分子分母的正负号要交换一下。下面就是针对于这种情况的一个用例。
3、求最大公约数,最小公倍数,固定代码
✨把加法的输出格式 弄好之后,其他三种就好做了
#include<cmath>
using namespace std;
int split(string s){
for(int i=0;i<s.length();i++){
if(s[i]=='/'){
return i;
}
}
}
int maxmin(int a,int b,int flag){
if(a<b)//大数放在前面
{
int temp=a;
a=b;
b=temp;
}
int gcd=0; //Greatest Common Divisor 最大公约数;
int lcm=a*b; // Lowest Common Multiple 最小公倍数;
int t=0;
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
gcd=a;
lcm=lcm/gcd;
if(flag == 0){
return gcd;
}else{
return lcm;
}
}
int fenzi(string s, int k, int flag){
int i=0;
int sum=0;
if(flag==1){
i=1;
}
for(;i<k;i++){
sum = sum*10 + (s[i]-'0');
}
return sum;
}
int fenmu(string s,int k){
int sum = 0;
for(int i=k+1;i<s.length();i++){
sum = sum*10 + (s[i]-'0');
}
return sum;
}
void huajian(int a,int b){
int aa = abs(a);
int k = maxmin(aa,b,0);
a = a/k;
b = b/k;//分别求出两组分数的最大公约数,进行化简
int z = 0;
int a1 = 0;
aa = abs(a);
if(aa>=b){ //分子比分母大,化为整数和分数的和
z = a / b ;
a1 = aa % b;
}
if(z<0){ //输出的各种情况
if(a1==0){
cout<<"("<<z<<")";
}else{
cout<<"("<<z<<" "<<a1<<"/"<<b<<")";
}
}else if(z==0){
if(a!=aa){
if(a==0){
cout<<"("<<a<<")";
}else{
cout<<"("<<a<<"/"<<b<<")";
}
}else{
if(a==0){
cout<<a;
}else{
cout<<a<<"/"<<b;
}
}
}else{
if(a1==0){
cout<<z;
}else{
cout<<z<<" "<<a1<<"/"<<b;
}
}
}
void add(int a1,int b1,int a2,int b2){
int k = maxmin(b1,b2,1);
int aa = k/b1;
int bb = k/b2;//求出两组分数分母的最小公倍数,进行通分
a1 = a1*aa;
a2 = a2*bb;
b1=b2=k;
int sum = a1+a2;
huajian(sum,k);
}
void jianfa(int a1,int b1,int a2,int b2){
int k = maxmin(b1,b2,1);
int aa = k/b1;
int bb = k/b2;//求出两组分数分母的最小公倍数,进行通分
a1 = a1*aa;
a2 = a2*bb;
b1=b2=k;
int sum = a1-a2;
huajian(sum,k);
}
void cheng(int a1,int b1,int a2,int b2){
huajian(a1*a2,b1*b2);
}
void chu(int a1,int b1,int a2,int b2){
if(a2<0){//当有负数时,分子分母要交换正负号
a2 = abs(a2);
b2 = 0-b2;
}
if(a2 == 0){
cout<<"Inf";
}else{
huajian(a1*b2,b1*a2);
}
}
int main(){
string s1;
string s2;
cin>>s1>>s2;
int k1 = split(s1);
int k2 = split(s2);
int flag1 = 0;//是否为负数
int flag2 = 0;
if(s1[0]=='-'){
flag1 =1;
}
if(s2[0]=='-'){
flag2 =1;
}
int a1,b1,a2,b2;
a1 = fenzi(s1,k1,flag1);
if(flag1 == 1){
a1 = 0-a1;
}
b1 = fenmu(s1,k1);
a2 = fenzi(s2,k2,flag2);
if(flag2 == 1){
a2 = 0-a2;
}
b2 = fenmu(s2,k2);
huajian(a1,b1);
cout<<" + ";
huajian(a2,b2);
cout<<" = ";
add(a1,b1,a2,b2);
cout<<endl;
huajian(a1,b1);
cout<<" - ";
huajian(a2,b2);
cout<<" = ";
jianfa(a1,b1,a2,b2);
cout<<endl;
huajian(a1,b1);
cout<<" * ";
huajian(a2,b2);
cout<<" = ";
cheng(a1,b1,a2,b2);
cout<<endl;
huajian(a1,b1);
cout<<" / ";
huajian(a2,b2);
cout<<" = ";
chu(a1,b1,a2,b2);
cout<<endl;
}