题目分析
更准确的说,下面写的代码是 估计两个小于或者等于N 的互异随机正整数互素的概率。
这里代码没有采用随机数的生成方式,而是枚举了所有可能的情况,算出了一对小于等于N的互异正整数互素的对数占所有互异正整数对数的份额。
在数学意义上,随着 N 的增大,其概率趋近于 6/(π^2)
代码实现
参考书上的伪代码,我编写了一个可以运行的代码:
#include <bits/stdc++.h>
using namespace std;
int gcd(int m,int n){
if(n>m) swap(m,n);
while(n>0){
int remainder=m%n;
m=n;
n=remainder;
}
return m;
}
int main()
{
int rel=0;
int tot=0;
int n=10;
int time=100;
while(time--){
for(int i=0;i<=n;i++){
for(int j=i+1;j<=n;j++){
tot++;
if(gcd(i,j)==1){
rel++;
}
}
}
cout<<"n:"<<n<<" probability:"<<(double)rel/tot<<endl;
n*=10;
}
}