Программа не будет работать с действительно большими числами - PullRequest
4 голосов
/ 28 сентября 2010

Я довольно новичок в программировании, и поэтому я делаю эту программу на C ++, которая возьмет число и найдет его основные факторы, которые прекрасно работают! Если только он не слишком велик для переменной int. все переменные типа int в длинные переменные long, чтобы это не имело значения, но, похоже, это не решает проблему. Программа выглядит следующим образом:

#include <iostream>

using namespace std;

bool prime (long long recievedvalue) { //starts a function that returns a boolean with parameters being a factor from a number
    long long j =1;
    long long 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
            return false;
            break; // breaks loop
            }
        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++;
            }
        }
    }


long long multiple(long long tbfactor){ //factors and then checks to see if factors are prime, then adds all prime factors together
    //parameter is number to be factored
    long long sum = 0;
    bool primetest = false;
    long long remainderfact;
    long long 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++;
    }
    return sum;
}

int main()
{
    long long input;
    long long output;
    cout << "Enter a number > 0 to find the sum of all it's prime factors: ";
    cin >> input;
    if (input == 0 || input <= 0){
        cout << "The number you entered was too small."<< endl << "Enter number a number to find the sum of all it's prime factors: ";
    cin >> input;
        }
    output = multiple(input);
    cout << output << endl << "finished";
    return 0;
}

Теперь, чтобы быть уверенным, проблема делает то же самое, независимо от того, является ли это int или нет. Кроме того, как я уже сказал, я новичок в программировании, и C в этом отношении, поэтому я с нетерпением жду ваших легко понятных ответов.:)

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Я хочу, чтобы ваша программа работала. Я уверен, что кто-то собирается заскочить и дать вам ответ в одно мгновение, но я надеюсь, что этого не произойдет, чтобы вы испытали то же самое, что я сделал, когда столкнулся с проблемой ГОДЫ назад.

Сделайте это: начните с 1, а затем увеличивайте, используя степени 2 (1, 2, 4, 8, 16 и т. Д.), И просто продолжайте, удваивая число ввода каждый раз. Когда он "перестает работать?" Это становится все медленнее?

Пожалуйста, прокомментируйте мой пост или самостоятельно, или отредактируйте свой, или опубликуйте ответ, независимо от того, что вы можете делать только с 56 повторениями. Если сообщество разрешит это (и, конечно, я бы хотел, чтобы сообщество продолжило урок), я бы хотел мягко подтолкнуть вас к ответу посредством серии обратных шагов, а не обычного способа, поскольку это очевидная уникальная возможность обучения.

2 голосов
/ 28 сентября 2010

Если вы пытаетесь найти, является ли число простым или нет, вот быстрое решение,

#include <iostream>

using namespace std;

#define ullong unsigned long long

bool prime (ullong x)
{
    if(x <= 1)
        return false;

    ullong s = (ullong)sqrt(x);

    for(ullong i=2;i<=s;i++)
        if(x%i == 0)
            return false;

    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...