蓝桥杯 既约分数

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,34 , 52 , 18 , 71 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?

这道题的思路很简单,就是分子分母均从1-2000遍历,如果两数最大公约数等于1,则为既约分数。
为了提高代码运行速度,分子分母可利用一下嵌套循环进行遍历。

	for (int denumerator = 2; denumerator <= 2020; denumerator++) {
		for (int numerator = 1; numerator < denumerator; numerator++) {
		……
		}
	}

两种做法,但是大同小异。

法一:

#include<iostream>

using namespace std;

//求x,y最大公约数
int  greatest_common_divisor(int x, int y) {
	
	int remainder = 1;//余数   被除数x  除数y
	
	//大小定序 x > y
	if (x < y) {
		int temp = x;
		x = y;
		y = temp;
	}

	while (1) {
		remainder = x % y;//求余数
		if (remainder == 0) return y;//余数等于0 返回最大公约数y(除数)
		x = y; 
		y = remainder;
	}
}


int main()
{
	int count = 0;
	for (int denumerator = 2; denumerator <= 2020; denumerator++) {
		for (int numerator = 1; numerator < denumerator; numerator++) {
			if (greatest_common_divisor(denumerator, numerator) == 1) {
				cout << "denumerator = " << denumerator << "\tnumerator = " << numerator << endl;
				count++;
			}
		}
	}

	cout<<"既约分数对数:"<< count * 2 + 1;
	return 0;

}

第一种方法是我自己写的,代码还是不够简洁规范。个人认为下面的更好点。

法二:

#include<iostream>

using namespace std;

int gcd(int a, int b) {
	if (b==0)
		return a;
	return gcd(b, a%b);
}
int main() {
	int num = 0;
	const int N = 2020;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (gcd(i, j) == 1) {
				num++;
//				if (j == 2020)
//				cout << i << '/' << j << '\n';
			}
		}
	}
	cout << num;

	return 0;
}



其实不同的就是它在求最大公约数时用了递归算法,法一利用的时while循环。

最后还是介绍一下如何求得两数中最大公约数,他是用的欧几里和《几何原本》的求解方法。详情推荐阅读此文章

https://jingyan.baidu.com/article/c910274bb3cd56cd371d2d58.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,带分数可以用分数类来表示。下面是一个简单的带分数类的实现: ```java public class Fraction { private int integer; private int numerator; private int denominator; public Fraction(int integer, int numerator, int denominator) { this.integer = integer; this.numerator = numerator; this.denominator = denominator; simplify(); } private void simplify() { if (numerator < 0 && denominator < 0) { numerator = -numerator; denominator = -denominator; } if (denominator < 0) { numerator = -numerator; denominator = -denominator; } if (integer < 0 && numerator > 0) { numerator = -numerator; } if (integer < 0 && numerator == 0) { integer = -integer; } if (numerator >= denominator) { integer += numerator / denominator; numerator = numerator % denominator; } int gcd = gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } private int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } public Fraction add(Fraction other) { int newNumerator = this.numerator * other.denominator + other.numerator * this.denominator; int newDenominator = this.denominator * other.denominator; int newInteger = this.integer + other.integer; return new Fraction(newInteger, newNumerator, newDenominator); } public String toString() { if (integer == 0 && numerator == 0) { return "0"; } String result = ""; if (integer != 0) { result += integer; if (numerator != 0) { result += "_"; } } if (numerator != 0) { result += numerator + "/" + denominator; } return result; } } ``` 这个带分数类实现了以下功能: - 构造函数可以根据整数部分、分子分母创建一个带分数对象。 - simplify() 方法可以将带分数对象化简,如将负号移到分子上、将整数部分和真分数部分合并、将分数化简等。 - add() 方法可以将两个带分数对象相加,返回一个新的带分数对象。 - toString() 方法可以将带分数对象转换为字符串形式。 这个类实现了带分数的加法操作,可以参考这个类来实现其他的运算操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值