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 に置き換える必要があります。

4

1 に答える 1

1

あなたの関数DividerIsPrimeは、現在書かれているように、論理的に常に返さなければならないという欠陥がありますTrue

これは、反復ごとにステータスが変更されるためです。に達した場合でもstatus=False(除算器のモジュラスがゼロになったため、数値は合成されます)、反復は続行され、いずれの場合もstatus=True、 最終反復で、divider == (data - 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. */

明らかに、「素数性テスト」にははるかに効率的なアルゴリズムがあります。

于 2010-06-27T06:30:52.003 に答える