结构体存储的有理数加减乘除

有理数的加减乘除运算

我们知道,有理数和无理数是两个相对的概念。我对有理数的理解即分数。当然这里的分母不能为0,要考虑排除这种情况。

首先定义一个结构体用于存储分子分母。

typedef struct
{
	int molecule;/* 分子 */
	int denominator;/* 分母 */
}ranumber;

然后我们看看题目的要求,有“加减乘除”这四则运算。加减函数很好写,如下。

ranumber add(ranumber a,ranumber b)     /* 加法函数 */
{
	ranumber c = {a.molecule*b.denominator + a.denominator*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}
ranumber minus(ranumber a,ranumber b)   /* 减法函数 */
{
	ranumber c = {a.molecule*b.denominator - a.denominator*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}

上面有一个simple函数用于化简。如下:

void simple(ranumber &c)/* 化简函数 */
{
	int d = reduction(c);
	c.molecule /= d;
	c.denominator /= d;
}

而在化简之前我们得先求分子分母的最大公约数,因此我们需要GCD(求最大公约数)函数。
我考虑了很多情况,分母小于0,分子小于0,分子分母同时小于0,都要将它们转化为正整数,因为求最大公约数只能对正整数进行操作。

int reduction(ranumber &c)/* 约分函数 */
{
	int temp;
	int a = c.denominator,b = c.molecule;/* a为分母,b为分子 */

	if(a < 0) a = -a;
	else if(b < 0) b = -b;
	else if(a < 0 && b < 0) 
	{
		a = -a;
		b = -b;
	}/* 求绝对值 */

	if(a < b) SWAP(a,b);
	while(b != 0)
	{
		temp = a % b;
		a = b;
		b = temp;
	}
	return a;/* 返回最大公约数 */
}

有了上面的铺垫,那么接下来的乘除法函数也很好写了:

ranumber multiple(ranumber a,ranumber b)  /* 乘法函数 */
{
	ranumber c = {a.molecule*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}
ranumber divide(ranumber a,ranumber b)  /* 除法函数 */
{
	ranumber c = {a.molecule*b.denominator,a.denominator*b.molecule};
	simple(c);
	return c;
}

你以为这样就结束了吗?不,没有,我们首先得告诉程序你要计算的两个分数分别是什么,因此我加了一个录入函数,也考虑了分子分母的正负数情况。

ranumber input(int a,int b) /* 录入函数 */
{
	if(b == 0)
	{
		a = 0;
		b = 1;
	}
	else if(b < 0)
	{
		a = -a;
	    b = -b;
	}
	ranumber temp = {a,b};
	simple(temp);
	return temp;
}

为了方便起见,我们可以借助一个输出函数,下面是我写的一个输出函数。

ranumber print(ranumber c)/* 输出函数 */
{
	int a = c.denominator,b = c.molecule;
	printf("%d%c%d",b,'/',a);
	return c;
}

第一次发表文章,可能有许多不足之处,还望大家见谅,这次主要就是想带大家分析题意,选择合适的函数,尽可能化简代码。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值