分数运算
reduction:约分
add:加法
minu:减法
multi:乘法
divide:除法
showresult:输出结果
需要注意的部分:
对于化简:
1、先修改正负号,保证up用来存正负数,down是永远正数的
2、如果0,规定up是0,down1
3、之后求最大公因数然后约分即可。
对于输出结果:
1、如果是整数,需要判断输出。不输出分母,里面包括了0的。
2、如果是小于0的,需要先输出一个负号,up变成abs up
3、如果是大于1,带分数先输出整数部分,修改up成小于1
4、后面正常输出。

#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; struct fraction { int up,down; }; int gcd(int a,int b) { if(a<b) { int temp=b; b=a; a=temp; } if(b==0) return a; return gcd(b,a%b); } fraction reduction(fraction result) { if(result.down<0) { result.up=-result.up; result.down=-result.down; } if(result.up==0) result.down=1; else { int temp=gcd(abs(result.up),result.down); result.up=result.up/temp; result.down=result.down/temp; } return result; } fraction add(fraction f1,fraction f2) { fraction temp; temp.up=f1.up*f2.down+f2.up*f1.down; temp.down=f1.down*f2.down; temp=reduction(temp); return temp; } fraction minu(fraction f1,fraction f2) { fraction temp; temp.up=f1.up*f2.down-f2.up*f1.down; temp.down=f1.down*f2.down; temp=reduction(temp); return temp; } fraction multi(fraction f1,fraction f2) { fraction temp; temp.up=f1.up*f2.up; temp.down=f1.down*f2.down; temp=reduction(temp); return temp; } fraction divide(fraction f1,fraction f2) { fraction temp; temp.up=f1.up*f2.down; temp.down=f1.down*f2.up; temp=reduction(temp); return temp; } void showresult(fraction f1) { f1=reduction(f1); if(f1.down==1) printf("%d ",f1.up); else { if(f1.up<0) { printf("-"); f1.up=abs(f1.up); } if(f1.up/f1.down) { int f=abs(f1.up)/f1.down; f1.up=abs(f1.up)%f1.down; printf("%d ",f); //printf("%d %d/%d ",abs(f1.up)/f1.down,abs(f1.up)%f1.down,f1.down); } printf("%d/%d ",f1.up,f1.down); } } int main() { fraction a,b; a.up=3; a.down=4; b.up=10; b.down=-12; showresult(reduction(a)); showresult(reduction(b)); showresult(add(a,b)); showresult(minu(a,b)); showresult(multi(a,b)); showresult(divide(a,b)); return 0; }