飞道的博客

【蓝桥杯基础题】2020年省赛填空题—既约分数

280人阅读  评论(0)

  • 👑专栏内容:蓝桥杯刷题
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停


一、题目背景

本题为2020年省赛填空题

  • C/C++ A 组第2题
  • C/C++ B 组第2题
  • Java A 组第2题

二、题目描述

如果一个分数的分子和分母的最大公约数1,这个分数称为既约分数。
例如, 3 4 \frac{3}{4} 43 1 8 \frac{1}{8} 81 7 1 \frac{7}{1} 17 都是既约分数。
请问,有多少个既约分数,分子和分母都是12020之间的整数 ?
注意: 包括12020

三、题目分析

最大公约数:指两个或多个整数共有约数中最大的一个。
这道题求解1~2020中所有的既约分数,本质上就是求在1~2020这个范围内,所有分子和分母的最大公约数为1的分数个数。

1.求最大公约数

①辗转相减法

int gcd(int a,int b)
{
   		
	while(a != b)
	{
   
		if(a>b)
		{
   
			a = a - b;
		}
		else 
		{
   
			b = b - a;
		}
	}
	return a;
}

②穷举法

int gcd(int x,int y)
{
   
   	int temp = 0;
    for(temp = x ; ; temp-- )
    {
   
		if(x%temp == 0 && y%temp==0) 
	   		break; 
   	}
	return temp;
}

③辗转相除法


int gcd(int x,int y){
   
	int rem;
	while(n > 0){
   
		rem = x % y;
		x = y;
		y = rem;
	}
	return x;			
}

④辗转相除法(递归)

int gcd(int x, int y) {
   
	if (x%y==0)
		return y;
	else 
	return gcd(y, x%y);
	}

2.枚举求解

知道了如何判断最大公约数,剩下的循环枚举就很简单了。

int main()
{
   
	int count = 0;
	for (int i = 1; i <= 2020; i++)
	{
   
		for (int j = 1; j <= 2020; j++)
		{
   
			if (gcd(i, j) == 1)
				count++;
		}
	}
	printf("%d", count);
	return 0;
}

四、代码汇总

1.C语言代码

#include<stdio.h>
int gcd(int x, int y) {
   
	if (x % y == 0)
		return y;
	else
		return gcd(y, x % y);
}
int main()
{
   
	int count = 0;
	for (int i = 1; i <= 2020; i++)
	{
   
		for (int j = 1; j <= 2020; j++)
		{
   
			if (gcd(i, j) == 1)
				count++;
		}
	}
	printf("%d", count);
	return 0;
}

 

2.C++代码

注意:C++的algorithm库中自带求最大公约数的函数(__gcd())我们无需像C语言一样手写。

#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
   
	int count = 0;
	for (int i = 1; i <= 2020; i++)
	{
   
		for (int j = 1; j <= 2020; j++)
		{
   
			if (__gcd(i, j) == 1)
				count++;
		}
	}
	cout << count << endl;
}

 

3.运行结果

以下为代码的运行结果。


故最终答案为:2481215

五、总结

最大公约数的求法

最大公约数的求法有很多,我这里最推荐记忆递归版本的。
因为代码量少不容易写错

int gcd(int x, int y) {
   
	if (x%y==0)
		return y;
	else 
	return gcd(y, x%y);
	}

转载:https://blog.csdn.net/weixin_61084441/article/details/128595270
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场