这两个题目都用到了求最大公约数的方法,进行调用
HDU 2054 又见gcd
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2504
题目:
Problem Description
有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
Input
第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b。
Output
输出对应的c,每组测试数据占一行。
Sample Input
2 6 2 12 4
Sample Output
4 8
代码如下:
#include<iostream>
using namespace std;
int gcd(int x,int y)
{
if(x<y) return gcd(y,x);
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int n,a,b,c;
while(cin>>n)
{
while(n--)
{
cin>>a>>b;
c=b*2;//b*2是b的最小公倍数
while(gcd(a,c)!=b)
{
c+=b;//继续找b的倍数,直到符合条件为止
}
cout<<c<<endl;
}
}
return 0;
}
HDC 2503 a/b+c/d
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2503
题目:
Problem Description
给你2个分数,求他们的和,并要求和为最简形式。
Input
输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整数a,b,c,d(0<a,b,c,d<1000),表示两个分数a/b 和 c/d。
Output
对于每组测试数据,输出两个整数e和f,表示a/b + c/d的最简化结果是e/f,每组输出占一行。
Sample Input
2 1 2 1 3 4 3 2 3
Sample Output
5 6 2 1
Sample Input
2 1 2 1 3 4 3 2 3
Sample Output
5 6 2 1
#include<iostream>
using namespace std;
int gcd(int x,int y)//求最大公约数
{
if(x<y) return gcd(y,x);
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int t,a,b,c,d,e,f,s;
while(cin>>t)
{
while(t--)
{
cin>>a>>b>>c>>d;
s=gcd(b,d);//调用b,d
s=b/s*d;//求b,d的最小公倍数,使分母相同都变为s
a=s/b*a;
c=s/d*c;
e=a+c;//分母相同,分子相加
f=s;//分子
s=gcd(f,e);//调用f,e
e/=s;//求最简分子分母
f/=s;
cout<<e<<" "<<f<<endl;
}
}
return 0;
}
Sample Input
2 1 2 1 3 4 3 2 3
Sample Output
5 6 2 1
Sample Input
2 1 2 1 3 4 3 2 3
Sample Output
5 6 2 1