2012-09-04 40 views
3

我編碼尋找兩個數字n和k的公約數。找到除數的數目不知道出了什麼問題

我正在使用找到GCD g的方法來實現它,然後找到GCD的除數。

但是代碼編譯,但運行:(

我已經吹我的頭在這個..誰能請在調試幫助.. 感謝提前給出了一個不響應消息

#include<iostream> 
#include<cstdio> 
#include<cmath> 
#include<cstring> 
#include<vector> 

using namespace std; 

vector<bool>p(1000002,true); 

long int getgcd(long int a, long int b) 
{ if(b == 0) 
      return a; 
    else 
      return getgcd(b, a % b); 
} 

void prime() 
{ int i,j; 
    for(i=2;i<1000001;i++) 
     if(p[i]) 
     for(j=i*i;j<1000001;j=j+i) 
      p[j]=false; 
    p[0]=false; 
    p[1]=false; 
} 

void divfind(long int a, long int b) 
{ 
    long int g; 
    g = getgcd(a,b); 
    int i,s,j=0,ans=1,num=0; 
    //short int fo[1000000]; 
    s=(int) sqrt(g); 
    for(i=2;i<s+1;i++) 
     if(p[i]) 
     { 
      while(g%i==0) 
      {g=g/i; 
      num++; 
      } 
      if(num) 
      ans*=++num; 
      num=0; 
     } 
     printf("%d\n",ans); 
} 

int main() 
{ 
    prime(); 
    long int n; 
    int q; 
    scanf("%ld %d",&n,&q); 
    while(q--) 
    { 
     int t; 
     long int k; 
     scanf("%d%ld",&t,&k); 
     if(t==1) 
     divfind(n,k); 
//  else if(t==2) 
//  divi(n,k); 
//  else 
//  nodivi(n,k); 
    } 
    return 0; 
} 
+0

不運行或不編譯?如果它編譯,那麼它可能運行...(不一定是你想要的結果)。 –

+0

它編譯,但不運行..具體而言,它不響應 – Aakashdeep

+0

嘗試並刪除divfind(),它仍然沒有響應? –

回答

2

你正在運行到整數溢出 - i*i只有安全達i=46340(〜2^15 *的sqrt(2))與32位整數,如:

i  i*i 
46339 2147302921 
46340 2147395600 
46341 -2147479015 
46342 -2147386332 

這會導致未定義的行爲。

+0

簽名整數可以處理高達20億((2^32-1)/ 2) –

+0

穆斯塔法:的確。但是,如果你想要計算我*我... – themel

+0

@themel非常感謝..它現在運行:) – Aakashdeep

相關問題