北大计算机研究生机试----最简真分数 - 果冻虾仁

时间:2024-02-18 13:12:28

2012北大计算机研究生机试----最简真分数

最简真分数

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:883

解决:357

题目描述:

给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。

输入:

输入有多组,每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000。
当n=0时,程序结束,不需要处理这组数据。

输出:

每行输出最简真分数组合的个数。

样例输入:
7
3 5 7 9 11 13 15
3 
2 4 5
0
样例输出:
17 
2

注意题目不是问把组合成的分数都化为最简真分数后,不重复的真分数共有几个。不是这个意思,而是问直接挑两个数过来组合。直接就是最简真分数的组合数有几个。

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 1005
int num[MAX];
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}

int main()
{
	int n;
	while(cin>>n)
	{
		if(!n)
			break;
		for(int i=0;i<n;i++)
			cin>>num[i];
		sort(num,num+n);
		int count=0;
		for(int i=0;i<n-1;i++)
			for(int j=i+1;j<n;j++)
				if(gcd(num[i],num[j])==1)
					count++;
		cout<<count<<endl;
	}
	return 0;
}


关于gcd(公约数):

早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。辗转相除法使用到的原理很聪明也很简单,假设用f(x, y)表示x,y的最大公约数,取k = x/y,b = x%y,则x = ky + b,如果一个数能够同时整除x和y,则必能同时整除b和y;而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x, y)= f(y, x % y)(y > 0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。 ------------------资料来源“百度百科”