概述
有理数的加减乘除运算
我们知道,有理数和无理数是两个相对的概念。我对有理数的理解即分数。当然这里的分母不能为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;
}
第一次发表文章,可能有许多不足之处,还望大家见谅,这次主要就是想带大家分析题意,选择合适的函数,尽可能化简代码。
最后
以上就是专注小鸭子为你收集整理的结构体存储的有理数加减乘除的全部内容,希望文章能够帮你解决结构体存储的有理数加减乘除所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复