从键盘读入一个求和算式,求出多个分数的和,结果也用分数表达,并约分到最简形式。
如,从键盘读入1/12+5/12+1/3,则输出:5/6
输入描述
分数求和表达式
输出描述
和的分数形式
用例输入 1
1/12+5/12+1/3
用例输出 1
5/6
如何求两个分数的和?以为例。按照数学规则,先对两个分数进行通分操作,找到两个分母的最小公倍数。这里采用的穷举算法,找到两个分母中较大者,这里不妨设为m,看是否能整除另一个分母n。如果不能,则试验2m,3m……最多到n*m,即可找到最小公倍数。
分母统一为最小公倍数,分子分别乘以相应的倍率,然后相加。
对最后的结果进行约分操作。约分这里也采用跟通分类似的操作,依然是穷举的思路。考虑分数a/b ,设x为a和b的最小值,尝试x能否同时整除a和b。如果可以,则x即为最大公约数,分子分母同除以x即可完成约分。不能整除,则x--,一直减到x为1为止。
由于结果需要输出分子和分母,这里的返回值采用了数组。
分数求和函数myPlus如下所示
int* myPlus(int a, int m, int b, int n) {
int* ans = (int*)malloc(sizeof(int) * 2);
if (m < n) {
int temp = m;
m = n;
n = temp;
temp = a;
a = b;
b = temp;
}
int minTimes = m;
while (minTimes % n != 0) {
minTimes += m;
}
a *= minTimes / m;
b *= minTimes / n;
int c = a + b;
int k = minTimes;
int minKC = c;
if (k < minKC)
minKC = k;
for (int i = minKC; i > 1; i--) {
if (k % i == 0 && c % i == 0) {
k = k / i;
c = c / i;
break;
}
}
ans[0] = c;
ans[1] = k;
return ans;
}
主函数需要对字符串进行处理。这里的思路是将分子和分母分别保存到两个数组中。观察输入的字符串,我们可以发现如下规律:刚开始的数字是分子,遇到‘/’变成分母,再遇到‘+’又变成分子,如此循环往复……利用此规律可完成由字符串到int数组的转化。
需要注意最后的输出,如果分母为1,那么结果是个整数,直接输出分子即可。
主函数如下
int main() {
int fenzi[10];
int fenmu[10];
int* pzi = fenzi;
int* pmu = fenmu;
char* c = (char*)malloc(sizeof(char) * 100);
cin >> c;
char* p = c;
bool zi = true;
while (*p != '\0') {
char* temp = (char*)malloc(sizeof(char) * 4);
char* pTemp = temp;
while (*p != '/' && *p != '+' && *p != '\0') {
*pTemp = *p;
p++;
pTemp++;
}
*pTemp = '\0';
int num = atoi(temp);
if (zi) {
*pzi = num;
pzi++;
}
else {
*pmu = num;
pmu++;
}
zi = !zi;
if (*p == '\0')
break;
p++;
}
//pzi pmu分别是分子分母最后一个有效数的后一个
int ans[2] = { fenzi[0], fenmu[0] };
int* p1 = fenzi + 1;
int* p2 = fenmu+1;
for (; p1 != pzi; p1++, p2++) {
int* temp = myPlus(ans[0], ans[1], *p1, *p2);
ans[0] = temp[0];
ans[1] = temp[1];
}
if (ans[1] == 1)
cout << ans[0];
else
cout << ans[0] << "/" << ans[1];
return 0;
}
完整代码如下
#include<iostream>
#include<stdlib.h>
using namespace std;
int* myPlus(int a, int m, int b, int n) {
int* ans = (int*)malloc(sizeof(int) * 2);
if (m < n) {
int temp = m;
m = n;
n = temp;
temp = a;
a = b;
b = temp;
}
int minTimes = m;
while (minTimes % n != 0) {
minTimes += m;
}
a *= minTimes / m;
b *= minTimes / n;
int c = a + b;
int k = minTimes;
int minKC = c;
if (k < minKC)
minKC = k;
for (int i = minKC; i > 1; i--) {
if (k % i == 0 && c % i == 0) {
k = k / i;
c = c / i;
break;
}
}
ans[0] = c;
ans[1] = k;
return ans;
}
int main() {
int fenzi[10];
int fenmu[10];
int* pzi = fenzi;
int* pmu = fenmu;
char* c = (char*)malloc(sizeof(char) * 100);
cin >> c;
char* p = c;
bool zi = true;
while (*p != '\0') {
char* temp = (char*)malloc(sizeof(char) * 4);
char* pTemp = temp;
while (*p != '/' && *p != '+' && *p != '\0') {
*pTemp = *p;
p++;
pTemp++;
}
*pTemp = '\0';
int num = atoi(temp);
if (zi) {
*pzi = num;
pzi++;
}
else {
*pmu = num;
pmu++;
}
zi = !zi;
if (*p == '\0')
break;
p++;
}
//pzi pmu分别是分子分母最后一个有效数的后一个
int ans[2] = { fenzi[0], fenmu[0] };
int* p1 = fenzi + 1;
int* p2 = fenmu+1;
for (; p1 != pzi; p1++, p2++) {
int* temp = myPlus(ans[0], ans[1], *p1, *p2);
ans[0] = temp[0];
ans[1] = temp[1];
}
if (ans[1] == 1)
cout << ans[0];
else
cout << ans[0] << "/" << ans[1];
return 0;
}