7-2 有理数加法(15 分)
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
我是这么写的。。。
#include<stdio.h>
int gys(int a, int b){
int t,c;
if(a < b){
t = b;
b = a;
a = t;
}
while(a != b){
a = a - b;
if(a < b){
t = b;
b = a;
a = t;
}
}
return a;
}
int gcd(int a, int b){
return a*b/gys(a,b);
}
int main(){
int a1,b1, a2, b2;
char q,w;
while(scanf("%d %c %d %d %c %d" , &a1,&q, &b1, &a2 ,&w, &b2) == 6){
int s = gys(b1, b2);
int d = gcd(b1, b2);
//b1 = d;
//b2 = d;
a1 = a1 * (d / b1);
a2 = a2 * (d / b2);
int sum = a1 + a2;
int a = gys(sum, d);
sum = sum/a;
d = d/a;
if(d == 1){
printf("%d\n", sum);
}
else
printf("%d/%d\n", sum, d);
}
return 0;
}
然而大神是这么写的
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;
#define For(i,l,r) for(int (i)=(int)(l);(i)<(int)(r);++(i))
#define FOR(i,l,r) for(int (i)=(int)(l);(i)<=(int)(r);++(i))
#define rof(i,l,r) for(int (i)=(int)(l);(i)>=(int)(r);--(i))
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long llu;
typedef unsigned int ui;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
// freopen("in.txt","r",stdin);
ll a,b,c,d;
scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
a=a*d+b*c;
b*=d;
ll g=gcd(a,b);
printf("%lld",a/g);
if(b/g!=1)printf("/%lld",b/g);
puts("");
return 0;
}
1:求公约数的算法我用了辗转相减(因为思考量最少。。。),所以需要判断a,b的大小,然而如上的辗转相除(递归写法)就不需要,因为会自动调换过来
2:我用了求公约数再求公倍数,但是这是人算的时候比较方便,然而对于程序来说,直接将分母相乘要方便。
3:题中对于数的大小没有规定,但是学长们为了保险都用了long long
4:对于头文件以及一些简便的写法先写出来,这点值得借鉴