c++程序(两个有理数相加):
#include <iostream>
#include<math.h>
using namespace std;
class num
{
public:
num(int i = 0, int j = 0) :n(i), m(j){}//构造函数(列表)
friend num operator+(const num& r1, const num& r2);//加号重载
void simplify();//化简
void print();//显示
~num(){};//析构函数
private:
double n;
double m;
};
num operator+(const num& r1, const num& r2)
{
num r;
r.n = r1.n * r2.m + r1.n * r1.m * r2.n;
r.m = r1.m * r2.m;
r.simplify();
return r;
}
void num::simplify()
{
int nn, mm, s = 0;
nn = abs(n);
mm = abs(m);
if (nn % mm == 0)
n = m = 1;
else
{
while (s = nn % mm)//辗转相除求最大公约数
{
nn = mm;
mm = s;
if (0 == (nn % mm))
break;
}
n = n / s;
m = m / s;
}
if (m < 0)
{
n = -n;
m = -m;
}
}
void num::print()
{
if (n == m == 1)
cout << 1 << endl;
else
cout << n << "/" << m << endl;
}
int main()
{
num r;
//num r1(1, 3), r2(1, 3);//输入定值
int a, b;
cin >> a;
cin.ignore(80, '/') >> b;
num r1(a, b);
cin.ignore(80,'+') >> a;
cin.ignore(80, '/') >> b;
num r2(a, b);
r = r1 + r2;
r.print();
return 0;
}
c语言源码(有理数个数无限制):
#include <iostream>
#include<string>
using namespace std;
void sum(int n, int* c, int* d)//求和
{
int product = 1, sum = 0, summ = 0;
for (int i = 0; i < 2 * n; i += 2)
{
summ = c[i];
for (int j = 1; j < 2 * n; j += 2)
if ((i+1) != j)
summ *= c[j];
sum += summ;
}
for (int i = 1; i < 2 * n; i += 2)
product *= c[i];
d[0] = sum;
d[1] = product;
}
void simplify(int n, int* d)//辗转相除法求最大公约数
{
int s = 0;
int nn = abs(d[0]), mm = abs(d[1]);
if (nn % mm == 0)
cout << 1 << endl;
else
{
while (s = nn % mm)
{
nn = mm;
mm = s;
if (0 == nn % mm)
break;
}
d[0] /= s;
d[1] /= s;
if (d[1] < 0)
{
d[0] = -d[0];
d[1] = -d[1];
}
cout << d[0] << '/' << d[1] << endl;
}
}
int main()
{
char a[1000] = {}, b[1000] = {'0'};
int c[1000] = {}, d[1000] = {};
gets_s(a);
int n = 0, j = 0;
for (int i = 0; i < strlen(a); i++)
if (a[i] == '/')
j++;
n = j;
for (int i = 0, j = 0; i < (3 * n + n - 1); i++)
if (a[i] != '/' && a[i] != '+')
b[j++] = a[i];
for (int i = 0; i < 2 * n; i++)
c[i] = b[i] - '0';
sum(n, c, d);
simplify(n, d);
return 0;
}