2

数を素因数分解してベクトルに格納し、最後にそれらを乗算して結果を検証するかどうかを尋ねるプログラムを作成しました。

これは次のように機能します: (numコード内で) 数値を要求し、それを 2 以上で割ります。

モジュロ ( moddivisorの場合) が 0 の数値 (コード内の the ) が見つかった場合、その除数をベクトルに格納し、それを で割ることによって減らしてに格納し、除数を 1 にリセットします (および最後のステートメントそのような数が見つからない場合、は より大きいか等しくなるまで増加します. このプロセスはが より大きいまで続きます.numdivisornumdivisortempwhiledivisornumdivisornum

コードは次のとおりです。

#include <iostream>
#include <vector>

using namespace std;

int main() {

    //num=the number of interest
    //divisor=the number dividing the number of interest each time
    unsigned long  divisor=2, num, temp ; //num=13699293826d
    char c;

    vector<unsigned long> divisors;
    cout<<"Enter a number: "<<endl;
    cin>>num;

    //temp stores the number that is reduced each time
    temp=num;

    while(divisor<=num)
    {
        if(temp%divisor==0)
        {
             temp=temp/divisor;
             divisors.push_back(divisor);
             cout<<"one "<<divisor<<endl;
             cout<<"the number of interest is now"<<temp<<endl;
             divisor=1;
        }
        if(divisor==temp&&temp!=1)
        {
            cout<<"two " << divisor<<endl;
            divisors.push_back(divisor);
        }

        divisor++;
    }

    if(divisors[0]==num)
    {
        cout<<"The number: "<<num<<" is prime. ";
    }
    else
    {
        cout<<"Its proper divisors are: ";
        for(unsigned int count=0; count<divisors.size(); count++ )
        {
            cout<<divisors[count]<<"\t";
        }
    }

    cout<<"Print out the multiplication? Press 'Y' or 'N'."<<endl;
    cin>>c;

    if(c=='Y'||c=='y')
    {
        for(unsigned int count=0; count<divisors.size(); count++)
        {
            temp*=divisors[count];
            cout<<temp<<"\t";
        }
    }
    return 0;
}

いくつかのデバッグcoutステートメントを出力しました。

私が抱えている問題は次のとおりです。数値が十分に大きい場合、「対象の数値は現在」というデバッグステートメントの後に数値1が続きます。その後、プログラムがクラッシュします。

コードの何が問題になっていますか?

ありがとう。


はい、64ビットで実行しています。

サンプル プログラムの出力:

    Enter a number: 
    13699293826
    one 3
    the number of interest is now: 1431655765
    one 5
    the number of interest is now: 286331153
    one 17
    the number of interest is now: 16843009
    one 257
    the number of interest is now: 65537
    one 65537
    the number of interest is now: 1

そして、プログラムがクラッシュします。

また、13699293826 を 3 で割ると 4562761275.33333333333333.....

編集#2 -------------------------------------------

    temp 65537, divisor 62287

    ..............omitted output

    temp 65537, divisor 65530
    temp 65537, divisor 65531
    temp 65537, divisor 65532
    temp 65537, divisor 65533
    temp 65537, divisor 65534
    temp 65537, divisor 65535
    temp 65537, divisor 65536
    temp 65537, divisor 65537
    one 65537
    the number of interest is now: 1
    Its proper divisors are: 3  5   17  257 65537   Print out the                 multiplication? Press 'Y' or 'N'.

その後、プログラムが応答を停止し、「y」を押して入力しても機能しません。

また、乗算された数が正しくありません。結果は 4294967295 です... グーグルで検索すると、「32 ビット (BInary digitTS) を使用して取得できる最大数」と表示されます。しかし、私の PC では、オペレーティング システムが 64 ビットであると表示されます。

4

1 に答える 1

2

「興味の数が1になりました」というメッセージが表示されたら、それは今ということtemp == 1です。この時点で停止する必要がありますが、続行します。なぜなら、ループは誤って と比較divisorしてnumいるのに、 と比較する必要があるからtempです。

したがってtemp == 1divisor == 2と が 0 になるまでループします。unsigned long divisorその時点で、チェックif(temp%divisor==0)によりゼロ除算が発生します。これは、どの入力に対しても起こると思います。


をリセットしないdivisorでください。ループ条件が間違っています。ループは次のようになります。

while( divisor*divisor <= temp)
{
    if(temp%divisor==0)
    {
         temp=temp/divisor;
         divisors.push_back(divisor);
         cout<<"one "<<divisor<<endl;
         cout<<"the number of interest is now"<<temp<<endl;
         ///// divisor=1;
    }
    /* ------ if(divisor==temp&&temp!=1)
    {
        cout<<"two " << divisor<<endl;
        divisors.push_back(divisor);
    } ------- */
    else ////////
        divisor++;
}
if( temp > 1)
{
    divisors.push_back( temp );
    temp = 1;  // <<-------------- ADD THIS
}
于 2013-05-01T09:04:01.110 に答える