[英]C++ Prime factor program 2 problems
好吧,所以我正在編寫一個程序(用C ++),該程序應該有一個數字,仔細檢查一下,找出它的因數是否為質數,如果是,將其加到一個和上,然后輸出所有估算值數字的主要因素。
我的程序似乎成功完成了此操作,但是它有2個問題,
1)我應該測試這個數字以查看這個數字的素因子的總和(600851475143),但對於整數而言,它太大了。 我不確定要使用什么其他變量類型,或者要更改哪個變量的類型。 如果可能的話,我真的很想對此進行清晰的解釋。
2)由於某種原因,當程序檢查數字是否為1的因數,然后檢查1是否為質數時,即使檢查該函數是否執行的第一步都表示1為質數最重要的是,如果它是1,那么它不是最主要的。 通過告訴它從所有主要因子之和的最后一個值中減去1,我找到了解決方法。 但是,這是一個解決辦法,並未真正找到問題所在。 如果有人至少指出問題出在哪里,我將不勝感激!
這是代碼,如有疑問,請詢問!
#include <iostream>
using namespace std;
bool prime (int recievedvalue) { //starts a function that returns a boolean with parameters being a factor from a number
int j =1;
int remainderprime = 0;
bool ended = false;
while (ended == false){ //runs loop while primality is undetermined
if (recievedvalue == 1){ //if the recieved value is a 1 it isn't prime
//not prime
break; // breaks loop
return false;
}
remainderprime=recievedvalue%j; //gives a remainder for testing
if ((remainderprime==0 && j>2) && (j!=recievedvalue || j == 4)){ //shows under which conditions it isn't prime
ended=true;
//not prime
return false;
}
else if (j==1){
j++;
}
else if ( recievedvalue==2 || j==recievedvalue ){ // shows what conditions it is prime
ended = true;
//prime
return true;
}
else {
j++;
}
}
}
int multiple(int tbfactor){ //factors and then checks to see if factors are prime, then adds all prime factors together
//parameter is number to be factored
int sum = 0;
bool primetest = false;
int remainderfact;
int i=1;
while (i<=tbfactor){ //checks if a i is a factor of tbfactor
remainderfact=tbfactor%i;
if (remainderfact==0){ //if it is a factor it checks if it is a prime
primetest = prime(i);
}
if (primetest ==true){ //if it is prime it add that to the sum
sum += i;
primetest=false;
}
i++;
}
sum --; // for some reason it always ads 1 as a prime number so this is my fix for it
return sum;
}
int main()
{
int input;
int output;
cout << "Enter number to find the sum of all it's prime factors: ";
cin >> input;
output = multiple(input);
cout << output;
return 0;
}
我真的很陌生,大概幾天之前,所以我現在對這些東西還很陌生,所以請為我輕松地解釋一下! 期待您的幫助! 謝謝!
對於1),您需要使用更大的數據類型。 64位整數在這里就足夠了,因此將int
更改為平台上調用的64位整數類型(可能是long
,或者可能是long long
)。
對於2),問題似乎是您在return false
之前先break
一下。 中斷導致代碼立即停止while循環,並在循環后立即繼續執行。 在這種情況下,似乎沒有分配過返回值(編譯器應警告您),因此返回的實際值實際上是任意的。
盡管其他人指出了您的數據類型有問題,但是第一個函數的結構還是有一些問題引起了我的注意。 (順便說一句,您的縮進令人着迷。)看一下這個簡化的版本:
bool prime (int recievedvalue) {
// ...
bool ended = false;
while (ended == false){
if (...){
break; // jumps _behind_ the loop
return false;
}
// ...
if (...) {
ended=true;
return false; // leaves function returning true
}
else if (...) {
// ...
}
else if (...) {
ended = true;
return true; // leaves function returning false
}
else {
// ...
}
}
// behind the loop
// leaves function returning random value
}
首先,每次將循環控制變量設置為ended
,無論如何都要使用其他方法退出循環,因此不需要此變量。 while(true)
或for(;;)
就足夠了。
而且,該break
跳到了循環的主體后面,但是那里沒有語句,因此代碼在不顯式返回任何內容的情況下離開了函數! 這就是所謂的Undefined Behavior 。 (根據C ++標准,從現在開始,您的程序可以自由執行自己喜歡的任何事情,包括返回隨機值(大多數實現會做到這一點),格式化HD,在您身上調用討厭的鼻惡魔或完全返回您期望的,但僅在周日。)
最后,該break
發生在return false;
之前return false;
因此從未達到。 實際上, 您的編譯器應該對此發出警告 。 如果不是,則您可能無法以最高警告級別進行編譯。 (您應該打開它。 始終嘗試以最高警告級別干凈地編譯代碼。 )如果確實如此,請學習注意編譯器警告 。 它們是在編譯過程中診斷問題的非常重要的工具。 (請記住:在編譯過程中診斷出的錯誤無需測試,也永遠不會交給客戶。)
return false
之前刪除break
。 由於中斷,執行將在循環外部恢復,並且永遠不會執行return false
操作。 要存儲大於4個字節(一個int的容量)的值,您可以使用多種選擇。 有關這些選項,請參閱此頁面 。 至於為什么程序返回true來檢查1是否為質數,請查看以下代碼部分:
if (recievedvalue == 1){ //if the recieved value is a 1 it isn't prime
//not prime
break; // breaks loop
return false;
}
break語句將退出,返回false將永遠不會到達。 要解決該問題,請刪除break語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.