数を素因数分解してベクトルに格納し、最後にそれらを乗算して結果を検証するかどうかを尋ねるプログラムを作成しました。
これは次のように機能します: (num
コード内で) 数値を要求し、それを 2 以上で割ります。
モジュロ ( moddivisor
の場合) が 0 の数値 (コード内の the ) が見つかった場合、その除数をベクトルに格納し、それを で割ることによって減らしてに格納し、除数を 1 にリセットします (および最後のステートメントそのような数が見つからない場合、は より大きいか等しくなるまで増加します. このプロセスはが より大きいまで続きます.num
divisor
num
divisor
temp
while
divisor
num
divisor
num
コードは次のとおりです。
#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 ビットであると表示されます。