2012-01-09 28 views
2

這個小小的C腳本檢查一個數字是否是一個主數據......不幸的是,它並沒有完全奏效。我知道腳本的低效率(例如sqrt優化),這些都不是問題。質數檢查爲什麼會檢查大數量的錯誤結果?

#include <stdio.h> 

int main() { 
    int n, m; 

    printf("Enter an integer, that will be checked:\n"); // Set 'n' from commandline 
    scanf("%d", &n); // Set 'n' from commandline 

    //n = 5; // To specify 'n' inside code. 

    for (m = n-1; m >= 1; m--) { 
    if (m == 1) { 
     printf("The entered integer IS a prime.\n"); 
     break; 
    } 
    if (n % m == 0) { 
     printf("The entered integer IS NOT a prime.\n"); 
     break; 
    } 
    } 
    return 0; 
} 

我測試了PROGRAMM有很多數字和它的工作...然後我嘗試一個更大的編號(1231231231231236),這顯然不是素... 但是:程序告訴我這是! ?

我錯過了什麼......?

+0

檢查32位整數的限制。這可能是溢出錯誤的結果 – ford 2012-01-09 16:44:13

+1

而不是'printf(「輸入的整數不是素數。\ n」);'try'printf(「%d不是素數。\ n」,n);' – pmg 2017-11-30 14:36:43

回答

6

數字「1231231231231236」太大而不適合「int」數據類型。添加一個printf語句來顯示你的程序認爲你給了它什麼編號,如果這是主要的,你的程序工作正常;否則,你可能有一個值得檢查的問題。增加對任意大小整數的支持需要付出相當大的額外努力。

你有這個問題的原因是像int這樣的內在數據類型有一個固定的大小 - 可能是32位或4字節,int。鑑於此,int類型的變量只能表示2^32個唯一值 - 大約40億個。即使你使用unsigned int(你不是),int類型也不能用來存儲大於40億的數字。你的數字比這個數字大幾個數量級,因此,當你試圖把你的輸入放到int變量中時,會發生一些事情,但我可以告訴你什麼不會發生:它沒有被賦值1231231231231236

+0

我怎麼能讓它下降一個太長的整數,並讓你再次輸入? – Nekcihc 2012-01-09 16:44:44

+0

您可以將輸入內容讀取爲字符串,然後檢查它以確保它只有數字0-9,並且不超過8個。這將限制您的數字在1,000,000,000以下,這絕對適合32位整數。 – Patrick87 2012-01-09 16:46:30

1

很難知道沒有更多的細節,但是如果你的int s是32位,那麼你通過的值超出了允許的範圍,這無疑會被表示爲你所擁有的值以外的值通過。您可能需要考慮使用unsigned int。

1

給定的數字對於C中的整數來說太大。可能它只接受它的一部分。嘗試打印n的值。