簡體   English   中英

整數類型long和除法

[英]integer type long and division

我只是編寫了將無符號整數分解為素數的過程。 如果將數據類型定義為“ 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。

當前編寫的函數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. */

顯然,有更有效的“素數測試”算法。

暫無
暫無

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

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