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,剩下的另外一个数就是两者最大的公约数。 ------------------资料来源“百度百科”