PTA天梯赛刷题
题目描述:
思路:
保留分数,进行加法运算,但需要化简。
还是没仔细看题……输入格式已经规定好了,但是我读题读成分数或整数形式,所以一开始想了一个不太对的想法,交上去拿了18分。
但是我是第一次写出这种思路,所以记录一下。
#include<iostream>
#include<algorithm>
using namespace std;
struct fraction{
long long up,down;//分子和分母,初始化分母为1(方便当输入为整数情况的计算)
}a,b;
fraction simp(fraction a)
{//约分
long long gcd = __gcd(a.up,a.down);
a.up/=gcd;
a.down/=gcd;
return a;
}
fraction add(fraction a,fraction b)
{//分数相加
a.up = a.up*b.down+b.up*a.down;
a.down = a.down*b.down;
a = simp(a);
return a;
}
int main()
{
int n;//其实后面把n忘记了……
char c;
cin>>n;
//初始化b
b.up=0;
b.down =1;
//此时需要在循环外先输入一个a便于后续加法的进行
cin>>a.up;
c=getchar();
if(c == ' ') a.down = 1;
else cin>>a.down;
a = simp(a);
while(c = getchar()){
if(c == ' '){//当输入为空格时,此时已经完成一个数的输入了(无论是整数还是分数)
//对上一个数进行结束处理
b = simp(b);//对b进行化简
a = add(a,b);//将b加到a中
cin>>b.up;//继续输入b的分子部分
//对下一个数进行预处理
b.down = 1;
}else if(c == '/'){
cin>>b.down;
}else if(c == '\n'){//输入结束
b = simp(b);
a = add(a,b);
break;
}
}
int i = a.up/a.down;//结果的整数部分
int d = a.up-i*a.down;//结果的小数部分的分母
if(i!=0) cout<<i;
if(i!=0 && d!=0) cout<<" ";
if(d!=0)cout<<d<<'/'<<a.down;
return 0;
}
写了几个测试点发现,当原数和为0时不会输出 :
if(i!=0) cout<<i;
这个语句写错了……
改成:
if(i!=0 &&a.up!=0) cout<<i;
else if(a.up==0) cout<<0;
后通过。