Hello大家好,今天做了一道PTA的题,题目比较简单,但是有些细节还是需要注意的,就比如我,调试了很长时间才通过测试,可能使我太菜吧!(?),现在将我的代码和解题过程发出来,仅供初学者参考!
题目:
解题思路:
这道题并不难,就是按照数学的解题思路,将之用程序代码描述出来。
要解决这道题,你先需要知道最大公约数和最小公倍数的求法,懂得了这个,这个题基本上就算结束了。。。。。
接下来请看::
long long gcd(long long a,long long b)//最大公约数
{
return (a%b!=0?(gcd(b,a%b)):b);
}
long long lcm(long long a,long long b)//最小公倍数
{
long long t=gcd(a,b);
return (a*b/t);
}
这是求最大公约数和最小公倍数的基本方法,相当于一个模板,只需要记住即可,这个不会的可以自行度娘。
然后我们需要知道,想求两个分数的和,肯定第一步是进行通分,然后相加化简,上边没有用的事Long Long型,因为要考虑溢出。
将他们加起来化简之后,按格式输出即可,需要注意的是:正负由分子决定,分子正则正、负则负。
接下来请看完整代码:
#include<stdio.h>
//typedef,将Long Long起别名LL,方便后边写和阅读。
//gcd函数为求两个数的最大公约数
typedef long long LL;
LL gcd(LL a,LL b){
if(a % b == 0) return b;
return gcd(b,a % b);
}
//主函数
int main()
{
int N;//输入分数的个数
scanf("%d",&N);
LL na,nb,a,b,q;
scanf("%lld/%lld",&na,&nb);
//循坏前一个与后一个分数相加
while(--N){
scanf("%lld/%lld",&a,&b);
//这部分为两个分数相加的过程,看不懂的可以在草稿纸上算一下哦!
q = gcd(nb,b);
nb = nb / q * b;
na =na* b / q;
na += nb / b * a;
//化简分数
if(na > 0) q = gcd(na,nb);
else q = gcd(-na,nb);
na /= q,nb /= q;
}
//按规定格式输出
LL cut = na;
if(na< 0) cut = -na;
if(cut % nb == 0)
printf("%lld\n",na / nb);
else{
cut = cut % nb;
if(na < 0) cut = -cut;
LL p = na / nb;
q = gcd(cut,nb);
cut /= q,nb /= q;
if(p != 0 && cut != 0)
printf("%lld%lld/%lld\n",p,cut,nb);
if(p == 0 && cut != 0)
printf("%lld/%lld\n",cut,nb);
}
return 0;
}
好啦,这就是今天的这道题了,希望对你们有用哦!?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。