求PI

很先进的方法。。。从0~32767个随即数中取出N个数,每2个为一对,共C2n对
找出其中除1以外没其他公约数的对子,m对

6/pi^2=m/C2n

还是暴力搜索。。。用时比较大

#include <iostream>
#include 
<vector>
#include 
<string>
#include 
<math.h>
#include 
<iomanip>
using namespace std;


int main()
{
    
int n,ran;
    vector
<int> num;
    
while (1)
    
{
        cin
>>n;
        
if (n==0)
        
{break;    }
        num.clear();
        
int sum=n*(n-1)/2;
        
while (n>0)
        
{
            cin
>>ran;
            num.push_back(ran);
            n
--;
        }

        
bool match;
        
int count=0;
        
for (size_t i=0;i<num.size()-1;i++)
        
{
            
for (size_t j=i+1;j<num.size();j++)
            
{
                match
=true;
                
for (int k=2;k<=(num[i]>num[j]?num[j]:num[i]);k++)
                
{
                    
if (num[i]%k==0&&num[j]%k==0)
                    
{
                        match
=false;
                        
break;
                    }

                }

                
if (match==true)
                
{count++;
                }

            }

        }

        
if (count==0)
        
{
            cout
<<"No estimate for this data set."<<endl;
        }

        
else
        
{
           
double pi=6*sum/(double)count;
           cout
<<setprecision(7)<<sqrt(pi)<<endl;
        }

    }

}

PS:貌似也可以用求2数的公约数来做,当不为1时,就不要了
int gys(int a, int b)
{ int r; //用于ab互换
if(a<b){r=a; a=b; b=r;} //如果a比b小就互换,使a比b大
while (b!=0)
{
r=a%b;
a=b;
b=r;
}
/*这个while就是这个程序的核心,它不断的使a和b做除然后求除余数然后最大的数a就没有用了,因为他们的公因数与现在的r和b的公因数相同。而这时,b的值会比r大,为了保证b为小的那个数,所以需要将b的值给a将r的值给b。然后继续做除,直到b=0时表示。已经被整除掉了。这时的a就为他们的最大公约数。*/
return a; //将最大公约数返回。
}