簡體   English   中英

我的C代碼有什么問題? (大量的主要因素)

[英]What's wrong with my C code? (Prime factors of a big number)

請你幫助我好嗎?

我是C語言的初學者,我的代碼無法正常工作。

我正在嘗試確定600851475143的最大素數,當我運行代碼時,它什么也沒做。 但是嘗試使用較小的數字是可行的。

long i;

for (i = 600851475143; i > 1; i--)
{
    if (600851475143 % i == 0)
    {
        printf("%d\n", i);
    }
};

它可能是32位系統。 數字600851475143大於32位。

而不是long i嘗試long i

long long i;

而不是printf("%d\\n", i); 嘗試:

printf("%lld\n", i);

並使用600851475143LL代替600851475143

首先,打印long整數的正確方法不是%d而是%ld (d =十進制,ld =長十進制)。 如果longint在您的系統上具有不同的大小(這很正常),則開始時將無法正確打印結果。

下一個可能的問題是600851475143遠遠超過了32 bit變量,但只能保證long至少為32 bit 它可能大於該值,但只能保證32 bits 那么,您確定系統上的long足夠long嗎?

嘗試

printf("%zu\n", sizeof(long));

如果它表示8 ,則一切都很好,如果僅顯示4 ,則long不夠,您需要使用long long代替(對於printf ,則使用%lld ,lld = long long十進制)。

最后但並非最不重要的一點是,您知道循環需要進行6000億次迭代,不是嗎? 即使您擁有一個具有非常快的CPU的非常快的系統,這也需要花費一些時間才能完成。 因此,您將立即看到600851475143出現在屏幕上,但是代碼終止(或找到另一個除數,如果這不是素數)將需要花費一些時間。

可選:您可以編寫600851475143LL而不是編寫600851475143 ,以使編譯器知道您希望此數字的類型為long long 似乎C 2011標准不再要求這樣做(如果需要,數字將自動被視為longlong long ),但是我知道,對於C 2011而言,有些編譯器最少會發出警告,指出數字大於int (或大於long )。

您可以使用小於或等於大數平方根的最大整數開始循環。 然后,您可以找到循環中起作用的因子對。 編寫一個單獨的函數來檢查給定數字是否為質數。 如果該對中較大的因子為素數,則將其返回。 如果較大的不是素數,請檢查較小的是否為素數,如果是則返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM