N个数求和(详解)
前言:今天你学习编程了吗?
题目详情:
本题的要求很简单,就是求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: 分母和
- 首先输入一个n,运用for循环,一次一次输入分子a和分母b,输入后进行通分后相加 ,每次加完需要进行约分(也就是找到它的最小公约数)
- 进行输出时,分三种情况:只有分子、只有整数、有分子也有整数
只有分子:说明最后结果<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步辗转相除法操作:就相当于我们以前学过的短除法,下面我通过实际例子展示
最后一步、输出
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的情况!