题目链接:7-33 有理数加法
一. 题目
1. 题目
2. 输入输出样例
3. 限制
二、代码(python)
1. 代码实现
python
def GetGcd(a, b): # 获取公约数
max_range:int
min_num:int
max_num:int
if a == b:
return a
elif a < b:
min_num = a
max_num = b
else:
min_num = b
max_num = a
# 获取可能是公约数的最大值
if min_num * 2 <= max_num:
max_range = min_num
else:
max_range = int(min_num / 2)
# 查找公约数,递减循环
for i in range(max_range, 1, -1):
if a % i == 0 and b % i == 0:
return i
return 0
def main():
num_in=input().split('/') # 获取输入,拆分为如["1","3 1", "6"]的形式
a = int(num_in[0]) # 第一个数的分子,即1
d = int(num_in[2]) # 第二个数的分母,即6
b, c = map(int, num_in[1].split(' ')) #第一个的分母和第二个的分子
fenZi = a * d + c * b # 求和公式,分子
fenMu = b * d # 求和公式,分母
gcd = GetGcd(fenZi, fenMu) # 求公约数
if gcd: #若存在公约数,进行约分
fenZi = int(fenZi / gcd)
fenMu = int(fenMu / gcd)
if fenMu == 1: # 分母为1
print("{0}".format(fenZi))
else:
print("{0}/{1}".format(fenZi, fenMu))
exit(main())
2. 提交结果
三、代码(c)
1. 代码实现
c
#include <stdio.h>
// 获取公约数
int GetGcd(int a, int b) {
int min_num, max_num, max_range;
if (a == b) {
return a;
} else if (a < b) {
min_num = a;
max_num = b;
} else {
min_num = b;
max_num = a;
}
// 获取可能是公约数的最大值
if (min_num * 2 <= max_num) {
max_range = min_num;
} else {
max_range = min_num / 2;
}
// 查找公约数,递减循环
for (int i = max_range; i > 1; i--) {
if (a % i == 0 && b % i == 0) {
return i;
}
}
return 0;
}
int main(void) {
int a, b, c, d, gcd, fenZi, fenMu;
if (scanf("%d/%d %d/%d", &a, &b, &c, &d) != 4) {
return -1;
}
fenZi = a * d + c * b;
fenMu = b * d;
gcd = GetGcd(fenZi, fenMu);
if (gcd) {
fenZi = fenZi / gcd;
fenMu = fenMu / gcd;
}
if (fenMu == 1) {
printf("%d", fenZi);
} else {
printf("%d/%d", fenZi, fenMu);
}
return 0;
}
2. 提交结果
四. 注意事项
- python需要将数据转换为整形
- 本题未考虑分子分母求和公式结果超出整形的情况