题目描述
给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。
输入描述:
每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000。
输出描述:
每行输出最简真分数组合的个数。
示例1
输入
7 3 5 7 9 11 13 15
输出
17
此题在理解题目时就走了很多弯路,一开始我以为是要求一组数中,任取两个组成分数,不同的分数值的个数时多少。
后来看了别人的答案,意思其实是 任取两个组成分数,该两个数恰好互质且组成真分数的个数。
也就是说,其实是任取两个数,求互质的组合有多少个,关键就是求两个数互质与否了。
这里学习了如果简单的求两个数的最大公约数的递归方法,也就是辗转相除法。
int Gcd(int a,int b)
{
if(b==0)
return a;
else
return Gcd(b,a%b);
}
一般来说都是要求a>b,但其实不用加以区分。如果a<b的话,下一次递归时刚好两者相反,只是多了一次递归调用。
如果两个数返回值为1,说明两者互质,否者返回值即为两者最大公约数。
代码:
#include <iostream>
using namespace std;
int Gcd(int a,int b)
{
if(b==0)
return a;
else
return Gcd(b,a%b);
}
int main()
{
int n,i,j;
int count=0;
cin>>n;
int p[n];
for(i=0;i<n;i++)
cin>>p[i];
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(Gcd(p[i],p[j]) == 1)
count++;
}
cout<<count;
return 0;
}