题意简单粗暴的模拟题,就是非常复杂
首先,我是将数字分成输入的a1b1c1、a2b2c2,以及输出的a3b3c3,c代表的是带分数的整数部分,如果有负数&&c有值,将负数赋予c,这样便于后期输出
其次是理好各种细节处理
1.化简及其效率(测试点4就是测试效率)
2.假分数转换成带分数
3.负数、分子为0、带分数的整数部分为0、计算结果 这四种输出情况
4.计算时的问题,负的带分数事实上应该是-(c + a/b)
需在计算上注意
卡了N天,自己在第1、4点上出了毛病,这种题真看细节啊……具体的化简方法日后奉上
AC代码:
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
long long a1,b1,a2,b2,c1,c2,a3,b3,c3;
void getnum(){
cin>>a1;
getchar();
cin>>b1;
cin>>a2;
getchar();
cin>>b2;
}
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
void simplify(long long &a,long long &b){
int d = gcd(a,b);
if(d<0) d = -d;
a = a/d;
b = b/d;
}
void improper_to_proper(long long &a,long long &b,long long &c){ //假分数转真分数
c = a/b;
if(c>=0) a -= (b*c);
else a = (a - b*c)*(-1);
}
void pr(long long &a,long long &b,long long &c){
if(a==0){
if(c>=0){
cout<<c;
}else{
cout<<'('<<c<<')';
}
}else{
if(c>0){
cout<<c<<' '<<a<<'/'<<b;
}else if(c==0){
if(a>0){
cout<<a<<'/'<<b;
}else{
cout<<'('<<a<<'/'<<b<<')';
}
}else{
cout<<'('<<c<<' '<<a<<'/'<<b<<')';
}
}
}
void sum(){//求和
if(c1<0){
if(c2<0){
a3 = (c1*b1-a1)*b2 + (c2*b2-a2)*b1;
}else{
a3 = (c1*b1-a1)*b2 + (c2*b2+a2)*b1;
}
}else{
if(c2<0){
a3 = (c1*b1+a1)*b2 + (c2*b2-a2)*b1;
}else{
a3 = (c1*b1+a1)*b2 + (c2*b2+a2)*b1;
}
}
b3 = b1*b2;
simplify(a3,b3);
improper_to_proper(a3,b3,c3);
pr(a1,b1,c1);
cout<<" + ";
pr(a2,b2,c2);
cout<<" = ";
pr(a3,b3,c3);
cout<<endl;
}
void subtraction(){
if(c1<0){
if(c2<0){
a3 = (c1*b1-a1)*b2 - (c2*b2-a2)*b1;
}else{
a3 = (c1*b1-a1)*b2 - (c2*b2+a2)*b1;
}
}else{
if(c2<0){
a3 = (c1*b1+a1)*b2 - (c2*b2-a2)*b1;
}else{
a3 = (c1*b1+a1)*b2 - (c2*b2+a2)*b1;
}
}
b3 = b1*b2;
simplify(a3,b3);
improper_to_proper(a3,b3,c3);
pr(a1,b1,c1);
cout<<" - ";
pr(a2,b2,c2);
cout<<" = ";
pr(a3,b3,c3);
cout<<endl;
}
void multiplication(){
if(c1<0){
if(c2<0){
a3 = (c1*b1-a1)*(c2*b2-a2);
}else{
a3 = (c1*b1-a1)*(c2*b2+a2);
}
}else{
if(c2<0){
a3 = (c1*b1+a1)*(c2*b2-a2);
}else{
a3 = (c1*b1+a1)*(c2*b2+a2);
}
}
b3 = b1*b2;
simplify(a3,b3);
improper_to_proper(a3,b3,c3);
pr(a1,b1,c1);
cout<<" * ";
pr(a2,b2,c2);
cout<<" = ";
pr(a3,b3,c3);
cout<<endl;
}
void division(){
pr(a1,b1,c1);
cout<<" / ";
pr(a2,b2,c2);
cout<<" = ";
if(c2==0&&a2==0){
cout<<"Inf"<<endl;
// cout<<"Inf";
return;
}
if(c1<0){
if(c2<0){
a1 = c1*b1-a1;
a2 = c2*b2-a2;
}else{
a1 = c1*b1-a1;
a2 = c2*b2+a2;
}
}else{
if(c2<0){
a1 = c1*b1+a1;
a2 = c2*b2-a2;
}else{
a1 = c1*b1+a1;
a2 = c2*b2+a2;
}
}
a3 = a1*b2;
b3 = a2*b1;
if(b3<0){
a3 = -a3;
b3 = -b3;
}
simplify(a3,b3);
improper_to_proper(a3,b3,c3);
pr(a3,b3,c3);
cout<<endl;
}
int main(){
getnum();
simplify(a1,b1);
improper_to_proper(a1,b1,c1);
simplify(a2,b2);
improper_to_proper(a2,b2,c2);
sum();
subtraction();
multiplication();
division();
}