求PI

很先進(jìn)的方法。。。從0~32767個(gè)隨即數(shù)中取出N個(gè)數(shù),每2個(gè)為一對,共C2n對
找出其中除1以外沒其他公約數(shù)的對子,m對

6/pi^2=m/C2n

還是暴力搜索。。。用時(shí)比較大

#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數(shù)的公約數(shù)來做,當(dāng)不為1時(shí),就不要了
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;
}
/*這個(gè)while就是這個(gè)程序的核心,它不斷的使a和b做除然后求除余數(shù)然后最大的數(shù)a就沒有用了,因?yàn)樗麄兊墓驍?shù)與現(xiàn)在的r和b的公因數(shù)相同。而這時(shí),b的值會(huì)比r大,為了保證b為小的那個(gè)數(shù),所以需要將b的值給a將r的值給b。然后繼續(xù)做除,直到b=0時(shí)表示。已經(jīng)被整除掉了。這時(shí)的a就為他們的最大公約數(shù)。*/
return a; //將最大公約數(shù)返回。
}