2010-06-27 74 views
0

我只寫了一個過程來將無符號整數分解爲素數。如果我將數據類型定義爲「int」,如果將其更改爲「long」,則結果將會錯誤。我不知道爲什麼。整數類型長整數和分數

順便說一句,我用Win-TC作爲我的編譯器。如下

代碼:

#include "stdio.h" 
#define True 0xff 
#define False 0x00 
char DividerIsPrime(unsigned long data); 
void CheckIfDataCanBeExtracted(unsigned long data); 
main() 
{ 
    unsigned long data; 
    printf("please input data:"); 
    scanf("%d",&data); 
    printf("\n%d=",data); 
    CheckIfDataCanBeExtracted(data); 
// printf("%d",sizeof(short)); 
    getch(); 
} 

void CheckIfDataCanBeExtracted(unsigned long data) 
{ 
    unsigned long divider,temp,data1; 
    data1=data; 
    for(divider=2;divider<=data;divider++) 
    { 
     temp=data1%divider; 
     if(temp) {continue; } 
     if(DividerIsPrime(divider)) { 
     data1 = data1/divider; 
     printf("%d",divider); 
     if(data1==1) break; 

     else {printf("*"); divider--;} 


     } 
    } 
    return; 

} 

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    char status=True; 
    for(divider=2;divider<data;divider++) 
    { 
     if(data%divider) status=True; 
     else status=False; 
    } 
    return status; 
} 

感謝保羅的幫助下,我知道錯了。 %d應該被替換爲%ld。

+1

結果是什麼?它怎麼錯了? – djna 2010-06-27 06:26:35

+0

首先,請正確格式化您的代碼,這幾乎不可讀。然後不要使用'char'作爲真值,在C89中你應該總是使用'int'而不是假的常量:我從來沒有看到有人使用255作爲真,哇。但是要說到這一點,你沒有告訴我們這是什麼以及如何失敗。 – 2010-06-27 06:35:44

+0

如果我輸入數據= 4,那麼它輸出4 = 2 * 2 * 3 * 1597 * -21753; 我打印data1/divider,其結果是負數..但我將其定義爲「無符號」。 – 2010-06-27 06:40:10

回答

1

您的功能DividerIsPrime,如目前所寫,具有缺陷,在邏輯上它必須始終返回True

原因是每次迭代都會改變狀態。即使達到status=False(該數字是合成的,因爲模數對於分頻器來說爲零),則迭代將繼續,並且在最終迭代中將達到status=True,當除數==(數據-1)

如下您可以更改此:

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    for(divider=2;divider<data;divider++) 
    { 
     if (0==(data % divider)) 
      return False; 
    } 

    return True; 
} 

你會發現這與一些「單元測試」,如:

assert(DividerIsPrime(5)); 
assert(!DividerIsPrime(6)); /* This test would fail without corrected code. */ 

顯然,對於「素性測試更加高效的算法」。

+1

但是,這個缺陷應該在整數上顯而易見。想知道爲什麼海報認爲整數/長差是重要的。 – djna 2010-06-27 06:40:22

+0

我改變了你提到的功能。但其結果重新發送失敗。 – 2010-06-27 06:42:17

+0

你知道原始函數是不正確的嗎?爲什麼?這聽起來像你只是在說我的話。 – 2010-06-27 07:25:26