2021.7.14
今天遇到的第一道有点意思的题
题目不难,难的是考虑情况全面...(就因为这个耗了一上午,不过还是有收获)
#include<stdio.h>
#include<stdlib.h>
long gcd(long a,long b)
{
return b == 0 ? a : gcd(b,a % b);//这种方法更优
}
int main()
{
long n,a,b,c=0,d=1;//题目给出范围为长整型
scanf("%ld",&n);
for(int i=1; i<=n; i++)
{
scanf("%ld/%ld",&a,&b);
c=c*b+d*a;
d*=b;
int g;
g=abs(gcd(c,d));//取绝对值,防止变号,变号后处理麻烦
c/=g;//防止溢出
d/=g;//防止溢出
}//不用开二维数组和第二次求和,更加简洁,以后碰到连加连乘都应该用这个,今天脑子抽了
if(c<0)
{
putchar('-');//小于0时,必定可以输出
c=-c;
}
long p;
p=c/d;
long z;
z=c%d;
if(p||!c)//整数部分非0,加"\\!c"是考虑到和为0的情况
{
printf("%ld",p);
}
if(p!=0&&z!=0)
{
printf(" ");
}
if(z!=0)
{
printf("%ld/%ld",z,d);
}
}
这次主要收获还是在这段代码上
long gcd(long a,long b)
{
return b == 0 ? a : gcd(b,a % b);//这种方法更优
}
之前是这样敲的
int gcd(int a,int b)
{
int r,t;
if(a<b)
{
t=a;
a=b;
b=t;
}//这里其实没有必要加这一段,执行一次之后也会换过来
while((r=a%b)!=0)//可能会出现除以0的情况,导致程序崩溃
{
a=b;
b=r;
}
return b;
}
主要问题还是没考虑全面(1.部分分子为0 2.和值为0),而且本身自己之前的代码也有一些问题,好在做了题之后找了出来
参考了下面两位大佬,感谢两位
代码思路
https://www.cnblogs.com/8023spz/p/10604089.html
测试点