题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1491
这里主要学到一个判定两个数是否互质的算法
1,用gcd求最大公约数,如果结果为1则互质,否则不互质,复杂度为O(logn)
2,从2到较小数依次查看每个数是否是两个数的公约数,有一个就不互质,否则互质,复杂度为O(n)
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
#define MAX 50
bool Ok(int a,int b)//朴素法
{
int i,m,n;
m = a <= b ? a : b;
n = a > b ? a : b;
for(i = 2;i <= m;++i)
if(m % i == 0 && n % i == 0)
return false;
return true;
}
bool Ok(int a,int b)//求最大公约数法
{
int t;
while(b != 0)
{
t = a % b;
a = b;
b = t;
}
return a == 1;
}
int main()
{
freopen("in.txt","r",stdin);
cout << setiosflags(ios::fixed) << setprecision(6);
int i,j,n,m,num[MAX];
while(cin >> n && n != 0)
{
for(i = 0;i < n;++i)
cin >> num[i];
m = 0;
for(i = 0;i < n;++i)
{
for(j = i + 1;j < n;++j)
if(Ok(num[i],num[j]))
++m;
}
if(m == 0)
cout << "No estimate for this data set." << endl;
else
{
n = n*(n-1) / 2;
cout << sqrt(6.0*n / m) << endl;
}
}
return 0;
}