求两个分数之和——结构体应用

问题描述: 使用结构体求两个分数的和,要求分数为最简分数。
输入: a b c d
输出: a /b + c/d = e/f

解题思路:
1.用结构体的两个成员分别表示一个分数的分子分母,所以要定义两个结构体类型变量;
2.计算得到结果的分子分母之后要约分,约分则要求出分子分母的最大公约数,因此要设计四个函数,分别计算结果、约分和求最大公约数和最大公约数的绝对值。

完整代码如下:

/*问题: 求两个分数之和。
        Written by: Jimmy Tung
        Date: 2020.03.29
*/
//输入: 四个整数表示两个分数
//输出: 算式
#include <stdio.h>
#include <stdlib.h>

struct fraction //结构体
{
    int nume;
    int deno;
};

struct fraction Sum( struct fraction, struct fraction); //求分数之和
struct fraction reduction( struct fraction ); //约分
int gcd(int, int); // 求两个数的最大公约数
int absolute(int); //求最大公约数的绝对值

int main(void)
{
    struct fraction f1, f2, f3; //定义两个结构体分别存储两个分数的分子分母
    printf("输入两个分数的分子分母:");
    scanf("%d%d%d%d", &f1.nume, &f1.deno, &f2.nume, &f2.deno);
    f3 = Sum( f1, f2);
    printf("%d/%d + %d/%d = %d/%d\n", f1.nume, f1.deno, f2.nume, f2.deno, f3.nume, f3.deno);

    system("PAUSE");
    return 0;
}

//求和
struct fraction Sum( struct fraction f11, struct fraction f21)
{
    struct fraction f0;
    //计算
    f0.nume = f11.nume*f21.deno + f11.deno*f21.nume;
    f0.deno = f11.deno*f21.deno;
    return reduction( f0 );
}

//约分
struct fraction reduction( struct fraction f)
{
    int a, b;
    a = f.nume;
    b = f.deno;
    b = gcd( a, b);
    f.deno /= b;
    f.nume /= b;
    return f;

}

//求最大公约数
int gcd(int a, int b)
{
    int temp;
    if( a*b == 0)
        return 1;
    if( a < b )//将较大值存放在a内
    {
        temp = a;
        a = b;
        b = temp;
    }
    while( a % b != 0)// 求分子分母的最大公约数
    {
        temp = a % b;
        a = b;
        b = temp;
    }
    return absolute( b );
}

//求最大公约数的绝对值
int absolute(int a)
{
    if (a > 0)
        return a;
    else
        return -a;
}

测试如下:

输入两个分数的分子分母:1 2 1 4
1/2 + 1/4 = 3/4
请按任意键继续. . .
输入两个分数的分子分母:-1 8 -3 8
-1/8 + -3/8 = -1/2
请按任意键继续. . .
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容