L1-009 N个数求和(详解)

N个数求和(详解)

前言:今天你学习编程了吗?

Alt

题目详情:

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

代码如下:

#include <stdio.h>
int Roll_Div(long long x, long long y) {
	int temp = 0;
	while (temp=x%y){
		x = y;
		y = temp;
	}
	return y;
}
int main() {
	int n,i;
    scanf("%d", &n);
	long long a, b;
	long long suma=0,sumb=0;
	
	for ( i = 0; i < n; i++) 
    {
		scanf("%lld/%lld", &a, &b);//a:分子 b:分母
		if (suma == 0 &&sumb==0) {
			suma = a;
			sumb = b;
		}
		else {
			
			suma = suma * b + sumb * a;
            sumb =sumb* b;
		}
		int com_fac=Roll_Div(suma, sumb);
			sumb /= com_fac;
			suma /= com_fac;
	}
	if (suma!=0 && (suma / sumb == 0))//只有分子部分
		printf("%lld/%lld\n", suma, sumb);
	else if (suma % sumb == 0)//只有整数部分
		printf("%lld\n", suma / sumb);
	else//有分数也有整数
		printf("%lld %lld/%lld\n", suma / sumb, suma%sumb, sumb);

	return 0;
}

思路

	a:分子     b:分母    suma:分子和     sumb:   分母和
  1. 首先输入一个n,运用for循环,一次一次输入分子a和分母b,输入后进行通分后相加 ,每次加完需要进行约分(也就是找到它的最小公约数)
  2. 进行输出时,分三种情况:只有分子、只有整数、有分子也有整数
    只有分子:说明最后结果<1,即分子<分母(分子/分母=0)(注意:这有坑呜呜呜)
    只有整数:分子>分母 且 分子是分母的倍数(分子%分母=0)
    有分子也有整数:有被整除部分,也有分数,前两种的结合

代码解读

int n,i;
    scanf("%d", &n);
	long long a, b;
	long long suma=0,sumb=0;

第1步首先定义几个变量 (长整形)

scanf("%lld/%lld", &a, &b);//a:分子 b:分母
		if (suma == 0 &&sumb==0) {
			suma = a;
			sumb = b;
		}

第2步分别输入 a:分子 b:分母 分开算第一次相加的情况,此时分子和suma、分母和sumb 为0,不可直接进行通分操作,最后结果还是为0,分情况讨论。

else {
			
			suma = suma * b + sumb * a;
            sumb =sumb* b;
		}

第3步进行通分操作,特别注意:得先算分子和suma,你猜为啥?(我踩过坑)
因为分子sumb随时在改变,如果先计算sumb,那计算suma是用了sumb改变后的值

	}
		int com_fac=Roll_Div(suma, sumb);
			sumb /= com_fac;
			suma /= com_fac;
	}

第4步进行找最大公因数进行约分(辗转相除法)

int Roll_Div(long long x, long long y) {
int temp = 0;
while (temp=x%y){
x = y;
y = temp;
}
return y;
}
第5步辗转相除法操作:就相当于我们以前学过的短除法,下面我通过实际例子展示
50x50
最后一步、输出

if (suma!=0 && (suma / sumb == 0))//只有分子部分
		printf("%lld/%lld\n", suma, sumb);
	else if (suma % sumb == 0)//只有整数部分
		printf("%lld\n", suma / sumb);
	else//有分数也有整数
		printf("%lld %lld/%lld\n", suma / sumb, suma%sumb, sumb);

分三种情况:
**只有分数部分:**也就是suma / sumb == 0 (分子小于分母)记得加上suma!=0 (特别注意,帮你们踩过坑了呜呜呜) 因为如果suma =0时,0/sumb=0
**只有整数部分:**也就是分子能把分母整除,suma % sumb = 0
**有整数,也有分数部分:**先求出整数部分,suma / sumb 就为整数部分,分数部分的分母还为原来的分母,分子为分子和分母的余数

总结

了解使用辗转相除法的用法,然后特别注意在通分操作时,得先处理分母,(分子在变化),在输出时,特别注意在输出只有分数部分,考虑分子等于0的情况!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值