-1

これは私のコードです:

#include <iostream>

using namespace std;

int main()
{
    long int x = 1;
    long int res;

    while (x<600851475143)
    {
        x++;
        if(600851475143%x==0)
        {
            res=x;
            cout<<x<<"\n";
        }
    }
}

何が問題なのかわかりませんが、次の出力が得られます。

839
1471
6857
59569
104441
486847
1234169
5753023
10086647
87625999
408464633
716151937
-716151937
-408464633
-87625999
-10086647
-5753023
-1234169
-486847
-104441
-59569
-6857
-1471
-839
-71
-1
Floating point exception

Process returned 136 (0x88)  execution time : 156.566 s
Press ENTER to continue.

そして、600851475143を13195に置き換えると[例にありました]...正常に動作し、次の出力が得られます:

5
11
55
11149

Process returned 0 (0x0) execution time : 0.005 s
Press ENTER to continue.

何が間違っているのかわかりません...:/ おそらく、以前のプログラムは正しく実行されませんでした...最初にintで試してから、long intに変更しました...違いはありません...

4

5 に答える 5

2

負の値はオーバーフローによるものです。符号付き整数の代わりに符号なし整数を使用することから始めます。それに加えて、32 ビットのコンピューターでは、long intintタイプは両方とも 32 ビットです。

unsigned long long int x = 1;
unsigned long long int res;

また、これらの定数が符号なしであるという事実を強調することもできます

while (x<600851475143U)
    {
        x++;
        if(600851475143U%x==0)
        {
            res=x;
            cout<<x<<"\n";
        }
    }
于 2012-02-14T14:02:10.887 に答える
2

の後に正の数が突然負になる場合は、整数オーバーフロー++の確実な兆候です。より大きな整数を保持できるデータ型を選択する必要があります。long long

余談ですが、問題で必要なように、アルゴリズムは最大の素因数を検索していません。素数であるとは限らない最大の因数を検索します。

ところで、因数分解する数の平方根に達したときに検索を停止することが正しいことを証明できれば、プログラムを大幅に高速化できます。

于 2012-02-14T14:04:32.287 に答える
1

を使用してみてくださいunsigned long long。少なくとも18,446,744,073,709,551,615(私が想像することさえできない数)を格納する必要があります。

于 2012-02-14T14:07:16.240 に答える
1

以下のコードは、ユーザーが入力した数値のすべての素因数を表示します。しかし、600851475143 は大きすぎて素因数を見つけることができません。このプログラムを修正して 600851475143 の素因数を調べ、それらの最大の素因数を見つけるように修正します。私は C++ を 2 か月しか学ばなかったので、これだけお手伝いできます。よろしくお願いします。

            #include<iostream.h>
            #include<conio.h>
            class primefactor
                 {
                    unsigned long int a;
                  public:
                            void factor();

                  };
           void primefactor::factor() 
                 {
                     cout<<"Enter any number to see its prime factors";
                     cin>>a;
                     int count=0;
                     int count1=0;
                     for(unsigned long int loop1=a;loop1>=1;loop1--)
                         {
                            if(a%loop1==0)
                              {
                                 for(unsigned long int loop=loop1;loop>=1;loop--)
                                       {
                                         if(loop1%loop==0)
                                              {
                                                  count++;
                                               }
                                         }
                             if(count==2)
                                {
                                    count1++;
                                    cout<<loop1<<"\t";
                                 } 
                          }
                     count=0;
                    }
                       cout<<"\n"<<"There are"<<count1<<"\t"<<"prime factors";
                 }

           void main()
                 {
                    primefactor k;
                       clrscr();
                    k.factor();
                       getch();
                  }
于 2013-01-19T05:23:23.513 に答える
1

変数の型は 12 桁の数字を保持できません。通常unsigned long intは、0 から 4,294,967,295 まで、符号付き - -2,147,483,648 から 2,147,483,647 までを格納できます。

于 2012-02-14T14:02:39.750 に答える