簡體   English   中英

C ++ Prime Factor Program 2問題

[英]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; 因此從未達到。 實際上, 您的編譯器應該對此發出警告 如果不是,則您可能無法以最高警告級別進行編譯。 (您應該打開它。 始終嘗試以最高警告級別干凈地編譯代碼。 )如果確實如此,請學習注意編譯器警告 它們是在編譯過程中診斷問題的非常重要的工具。 (請記住:在編譯過程中診斷出的錯誤無需測試,也永遠不會交給客戶。)

  1. 在64位系統上使用64位數字,或使用執行任意精度算術的庫
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM