一、问题描述
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如3/4,1/8,7/1 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2022 之间的整数(包括 1 和 2022)?
二、题目要求
考察
1.最大公约数、公倍数
2.建议用时15~25min
三、问题分析
判断一个分数是不是既约分数,要利用双重for循环分别判断分子和分母的约数,比如上面
3的公约数为1、3,4的公约数为1、2、4,两者的公约数为1,符合上述条件。
而8的约数为1 2 4 8,4的约数为1 2 4,4和8的最大公约数为4,不符合条件。
对于两个数字判断他们得到最大公约数,可以单独构造一个函数:
int gcd(int x,int y)//构造单独函数
{
if(x%y==0) return y;//如果x%y没有余数,返回最大公约数y
else return gcd(y,x%y);//重新调用计算
}
举例:
假设上面的x,y分别为10、8,10%8==2,把原来的8赋值到x,取模之后的2复制到y。
现在x,y分别变成8,2,8%2==0,结束输出结果。
拓展
1.C++头文件,algorithm之中包含最大公约数__gcd(a,b),直接使用即可
2.最小公倍数:在求出最大公约数的基础上,原来给定的两个数字相乘/最大公约数。上面给定的是10 8,最大公约数是2,所以最小公倍数:10*8/2=40。
四、编码实现
```c++
#include<iostream>
using namespace std;
int gcd(int x,int y)//最大公约数判断
{
if(x%y==0) return y;//取模等于0,返回结果
else return gcd(y,x%y);//重新调用计算
}
int main()
{
int i,j,n=2022;//初始化条件
long long int ans=0;//ans定义为0
for(i=1;i<=n;i++)//第一层for循环
{
for(j=1;j<=n;j++)//第二层for循环
{
if(gcd(i,j)==1)//判断i ,j的最大公约数是否为1
{
ans++;//判断成功,ans++
}
}
}
cout<<ans;//输出结果
return 0;
}
## 五、输出结果
输出结果为:2486423
