知识点
笔记:gcd函数使用
求两个数的最大公约数。
格式:gcd(a,b);要求a,b类型相同,a和b中间无空格。
手打gcd函数:
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
相关练习
题目描述
输入一组勾股数 a,b,c(a!=b!=c),用分数格式输出其较小锐角的正弦值。(要求约分。)
输入格式
一行,包含三个正整数,即勾股数 a,b,ca,b,c(无大小顺序)。
输出格式
一行,包含一个分数,即较小锐角的正弦值
输入输出样例
输入
3 5 4
输出
3/5
说明/提示
数据保证:a,b,c 为正整数且 ∈[1,10^9]。
(未AC)第一版代码:
#include <iostream>
using namespace std;
int main()
{
int a,b,c,min=100000,max=-100000;
cin>>a>>b>>c;
if(a>max) max=a;
if(b>max) max=b;
if(c>max) max=c;
if(a<min) min=a;
if(b<min) min=b;
if(c<min) min=c;
cout<<min<<"/"<<max;
return 0;
}
测试结果:
未通过测试点数据:
输入 6 8 10
输出 3/5
坑:需要约分!
已AC代码:
#include <iostream>
using namespace std;
long long int gcd(long long int a,long long int b)
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
int main()
{
long long int a,b,c;
long long int min=1000000000,max=-1000000000; //最大最小值要足够大或小
cin>>a>>b>>c;
if(a>max) max=a;
if(b>max) max=b;
if(c>max) max=c;
if(a<min) min=a;
if(b<min) min=b;
if(c<min) min=c;
cout<<min/gcd(min,max)<<"/"<<max/gcd(min,max);
return 0;
}
模板题
洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 (AC的第100题)/ 洛谷 B3634 最大公约数和最小公倍数
题目描述
输入两个正整数 ,求出满足下列条件的 P, Q 的个数:
-
P,Q 是正整数。
-
要求 P, Q 以 为最大公约数,以 为最小公倍数。
试求:满足条件的所有可能的 P, Q 的个数。
输入格式
一行两个正整数 。
输出格式
一行一个数,表示求出满足条件的 P, Q 的个数。
输入输出样例
输入
3 60
输出
4
说明/提示
P,Q 有 4 种:
- 3,60。
- 15,12。
- 12,15。
- 60,3。
对于 100% 的数据,。
【题目来源】
NOIP 2001 普及组第二题
已AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//虽然c++自带gcd函数,但NOIP中不能使用
int gcd(int a,int b) //求最大公约数
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
int main()
{
int x0,y0,i,j,check1,check2,sum=0;
cin>>x0>>y0;
for(i=x0;i<=y0;++i)
{
int j=x0*y0/i;
//*最大公约数与最小公倍数的乘积就是所求的两个数的乘积
if((gcd(i,j)==x0)&&(i*j/gcd(i,j)==y0)) sum++;
//求得的最大公约数和最小公倍数相等,计数器加一
}
cout<<sum<<endl;
return 0;
}