#include<iostream>
using namespace std;//实现分数的运算
#include<string>
class Fraction_cal
{
public:
Fraction_cal();
bool detect(string a); //检测输入的数据中是否存在“/”,这是用来判断一个数据是否为分数的标准
int position(string a); //返回"/"的位置
int max_divisor(int a,int b) ; //进行最大公约数的寻找,原理上就是利用辗转相除法
void seg_number(string a,string b); //将接收到的分数进行预处理,切割为分子、分母
string f_plus(string a,string b); //分数的加法
string f_subtraction(string a,string b); //分数的减法
string f_multiply(string a,string b); //分数的乘法
string f_division(string a,string b); //分数的除法
string change_form(string numerator,string multiply); //将输出数据表示得更加规范,比如0/1,12/1等数字
~Fraction_cal(){};
private: //相较于静态成员变量,普通成员变量每一个实例化对象都有独自的属性
string a1 ; //第一个分数的分子
string a2 ; //第一个分数的分母
string b1 ; //第二个分数的分子
string b2 ; //第二个分数的分母
};
Fraction_cal::Fraction_cal() //构造函数
{
string a1 = " ";
string a2 = " ";
string b1 = " ";
string b2 = " ";
}
bool Fraction_cal:: detect(string a)
{
for(unsigned int i = 0;i<a.length();i++)
{
if(a[i]=='/')
{
return true; //是分数
}
}
return false; //是整数
}
int Fraction_cal:: position(string a)
{
for(unsigned int i = 0;i<a.length();i++) //无符号整型和有符号整型最好不要比较
{
if(a[i]=='/')
{
return i;
}
}
return a.length();
}
int Fraction_cal::max_divisor(int a,int b) //辗转相除法,不断用除数除以余数,直至余数为0
{
int remainder = 1;
int num1 = abs(a);
int num2 = abs(b);
while(remainder!=0)
{
remainder = num1 % num2;
num1 = num2;
num2 = remainder;
}
return num1;
}
void Fraction_cal::seg_number(string a,string b)
{
if(detect(a))//说明a是分数
{
int p1 = position(a); //记录分数符号的位置
a1 = a.substr(0,p1);
a2 = a.substr(p1+1,a.length());
}
else
{
a1 = a;
a2 = "1";
}
if(detect(b)) //说明b是一个分数
{
int p2 = position(b); //记录分数符号出现的位置
b1 = b.substr(0,p2);
b2 = b.substr(p2+1,b.length());
}
else
{
//cout<<"test1"<<endl;
b1 = b;
b2 = "1";
}
}
string Fraction_cal::f_plus(string a,string b) //相加运算
{
seg_number(a,b);//进行数据的预处理,确定好输入的分子和分母
//cout<<a1<<" "<<a2<<" "<<b1<<" "<<b2<<endl;
int num1 = stoi(a1);
int num2 =stoi(a2);
int num3 = stoi(b1);
int num4 = stoi(b2);
//cout<<num1<<" "<<num2<<" "<<num3<<" "<<num4<<endl;
int com_multiply = num2*num4; //确认分母的公倍数
int sum_numerator = num1*num4+num3*num2;//确认分子的和
int max_div = (max_divisor(com_multiply,sum_numerator));//确认分子分母的最大公约数
int final_com_multiply = com_multiply / max_div;
int final_sum_numerator = sum_numerator / max_div;
string final_r_denominator = to_string(final_com_multiply);//将分母转化为字符串类型
string final_r_numerator = to_string(final_sum_numerator); //将分子转化为字符串
//string result = final_r_numerator +"/"+final_r_denominator; //将最终结果进行拼接
string result = change_form(final_r_numerator,final_r_denominator);
return result;
}
string Fraction_cal::f_subtraction(string a,string b) //分数的减法 a1,a2,b1,b2
{
seg_number(a,b); //数据预处理
int num1 = stoi(a1);
int num2 =stoi(a2);
int num3 = stoi(b1);
int num4 = stoi(b2);
int com_multiply = num2*num4; //确认分母的公倍数
int sum_numerator = num1*num4-num3*num2;//确认分子的差
int max_div = (max_divisor(com_multiply,sum_numerator));//确认分子分母的最大公约数
int final_com_multiply = com_multiply / max_div; //约分操作
int final_sum_numerator = sum_numerator / max_div;
string final_r_denominator = to_string(final_com_multiply);//将分母转化为字符串类型
string final_r_numerator = to_string(final_sum_numerator); //将分子转化为字符串
//string result = final_r_numerator +"/"+final_r_denominator; //将最终结果进行拼接
string result = change_form(final_r_numerator,final_r_denominator);
return result;
}
string Fraction_cal::f_multiply(string a,string b)
{
seg_number(a,b);
int num1 = stoi(a1);
int num2 =stoi(a2);
int num3 = stoi(b1);
int num4 = stoi(b2);
string result = " ";
int sum_numerator = num1*num3; //分子分子相乘
int sum_multiply = num2*num4; //分母分母相乘
int max_div = (max_divisor(sum_numerator,sum_multiply));
int final_numerator = sum_numerator / max_div; //约分操作
int final_multiply = sum_multiply / max_div;
string final_r_numerator = to_string(final_numerator);
string final_r_multiply = to_string(final_multiply);
//result = final_r_numerator + "/" + final_r_multiply;
result = change_form(final_r_numerator,final_r_multiply);
return result;
}
string Fraction_cal::f_division(string a,string b)
{
seg_number(a,b);
int num1 = stoi(a1);
int num2 =stoi(a2);
int num3 = stoi(b1);
int num4 = stoi(b2);
string result = " ";
int sum_numerator = num1*num4; //分子分子相乘
int sum_multiply = num2*num3; //分母分母相乘
int max_div = (max_divisor(sum_numerator,sum_multiply));
int final_numerator = sum_numerator / max_div; //约分操作
int final_multiply = sum_multiply / max_div;
if(final_numerator*final_multiply>=0)
{
string final_r_numerator = to_string(abs(final_numerator));
string final_r_multiply = to_string(abs(final_multiply));
//result = final_r_numerator + "/" + final_r_multiply;
result = change_form(final_r_numerator,final_r_multiply);
}
else
{
string final_r_numerator = to_string(abs(final_numerator));
string final_r_multiply = to_string(abs(final_multiply));
// result = "-" + final_r_numerator + "/" + final_r_multiply;
result = change_form("-"+final_r_numerator,final_r_multiply);
}
return result;
}
string Fraction_cal::change_form(string numerator,string multiply)
{
string result;
if(numerator == "0"||numerator== "-0") //-0/1
{
result = "0";
}
else if(multiply == "1")
{
result = numerator;
}
else
{
result = numerator + "/" + multiply;
}
return result;
}
// int main()
// {
// Fraction_cal c1;
// cout<<c1.f_plus("-32/3","23")<<endl;//-32 3 23 45
// cout<<c1.f_subtraction("-33/3","-23")<<endl;
// cout<<c1.f_multiply("-0/18","-3/5")<<endl;
// cout<<c1.f_division("6/2","-1/5")<<endl;
// return 0;
// }
第一次发CSDN博客,写的一般般,还请见谅。想用的伙伴们拿走不谢,记得点个赞就行。直接使用的话把main函数的注释取消就行了。整个代码已经封装好了,也可直接作为第三方库使用。