题目分析

更准确的说,下面写的代码是 估计两个小于或者等于N 的互异随机正整数互素的概率。
这里代码没有采用随机数的生成方式,而是枚举了所有可能的情况,算出了一对小于等于N的互异正整数互素的对数占所有互异正整数对数的份额。
在数学意义上,随着 N 的增大,其概率趋近于 6/(π^2)

代码实现

参考书上的伪代码,我编写了一个可以运行的代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int gcd(int m,int n){
  4. if(n>m) swap(m,n);
  5. while(n>0){
  6. int remainder=m%n;
  7. m=n;
  8. n=remainder;
  9. }
  10. return m;
  11. }
  12. int main()
  13. {
  14. int rel=0;
  15. int tot=0;
  16. int n=10;
  17. int time=100;
  18. while(time--){
  19. for(int i=0;i<=n;i++){
  20. for(int j=i+1;j<=n;j++){
  21. tot++;
  22. if(gcd(i,j)==1){
  23. rel++;
  24. }
  25. }
  26. }
  27. cout<<"n:"<<n<<" probability:"<<(double)rel/tot<<endl;
  28. n*=10;
  29. }
  30. }
  • rel (relatively prime):互素。
  • tot(total):总计