C语言实现分数加法器

从键盘读入一个求和算式,求出多个分数的和,结果也用分数表达,并约分到最简形式。

如,从键盘读入1/12+5/12+1/3,则输出:5/6

输入描述

分数求和表达式

输出描述

和的分数形式

用例输入 1 

1/12+5/12+1/3

用例输出 1 

5/6

如何求两个分数的和?以\frac{a}{m}+\frac{b}{n}为例。按照数学规则,先对两个分数进行通分操作,找到两个分母的最小公倍数。这里采用的穷举算法,找到两个分母中较大者,这里不妨设为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值