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


  • 相关阅读:
    谷歌推开发者培训指南 欲提升Android软件质量
    装饰者模式【java版】
    Java GetBytes 编码方式
    为什么程序员都是夜猫子
    Android的Handler总结
    常见的自然法则及管理启示
    java常用设计模式
    Android optionsmenu例程
    关于程序员成长的一点思考
    Java 字节流读写文件
  • 原文地址:https://www.cnblogs.com/unclejelly/p/4082127.html
Copyright © 2011-2022 走看看