0
点赞
收藏
分享

微信扫一扫

有理数相加(c和c++分别实现)


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;
}


举报

相关推荐

0 条评论