问题描述: 使用结构体求两个分数的和,要求分数为最简分数。
输入: 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
请按任意键继续. . .