2014-01-13 36 views
0
long long int fun2(int a, int b, int m) 
{ 
    long long int res = 1; 
    long long int c = a % m; 

    for (int i = 1; i <= b; i <<= 1) 
    { 
     c = c % m; 
     if ((b & i) != 0) 
     { 
      res = res * c; 
      res = res % m; 
     } 
     c = c * c; 
    } 

    return res; 
} 

int fun(int num, int k) 
{ 
    srand((unsigned)time(NULL)); 

    if (num <= 1) 
    { 
     return num * 10; 
    } 

    if (num == 2 || num == 3 || num == 5) 
    { 
     return num * 10 + 1; 
    } 

    if (num % 2 == 0) 
    { 
     return num * 10; 
    } 

    if (num % 3 == 0) 
    { 
     return num * 10; 
    } 

    if(num % 5 == 0) 
    { 
     return num * 10; 
    } 

    int s = 0; 
    int s_pow = 1; 

    while ((s_pow & (num - 1)) == 0) 
    { 
     s = s + 1; 
     s_pow = s_pow << 1; 
    } 

    int d = num/s_pow; 

    for (int i = 0; i < k; i++) 
    { 
     int a = (int)((num - 1) * rand()/(RAND_MAX + 1.0)) + 1; 

     if (fun2(a, d, num) != 1) 
     { 
      is_prime = false; 
      for (int r = 0; r <= s - 1; r++) 
      { 
       if (fun2(a, (1 << r) * d, num) == num - 1) 
       { 
        is_prime = true; 
        break; 
       } 
      } 
      if (!is_prime) 
      { 
       return num * 10; 
      } 
     } 
    } 

    return num * 10 + 1; 
} 

問題出在哪裏,也許這些long long int與int比較不能正常工作。 編譯窗口和linus沒有任何警告。它的工作原理,但給Linux不好的結果,因爲Windows是好的。請幫忙。爲什麼這段代碼可以在Windows 7上使用visual studio並且不能正常工作對於linux

@EDIT 我刪除代碼INT_MIN和INT_MAX我只是試圖與此問題解決了。 (對不起,應該刪除)

+5

這將會是有益的給一個具體的例子 - 一個特定的輸入,你能指望得到vs什麼是實際結果。 – ysap

+0

你說「沒有警告」,但你是否嘗試在Linux上用'-Wall'編譯? – JAB

+0

Linux和Windows有各類不同的定義......看到http://stackoverflow.com/questions/15908789/cross-platform-definition-of-64-bit-integers-in-c-for-windows-and-linux – cubitouch

回答

0

問題由自己解決!!!!想象一下,問題是隨機的。我交流這個

int a = (int)((num - 1) * rand()/(RAND_MAX + 1.0)) + 1; 

與此

int a = (int)(rand()%(num-1)) + 1; 

和一切都運行完美 - user3144540

相關問題