Новый ответ под тем же номером? С++

Итак, у меня есть эта программа:

#include <iostream>

using namespace std;


bool prime(int input)
{
//    cout << "pinput: " << input << endl;
    int i = ((input/2) + 1);
  //      cout << "pi: " << i << endl;
    int c;
    for (i>0; i--;){
        //cout << "pi: " << i << endl;
        if (input == 3 || input == 2){
         //   cout << "true" << endl;
            return true;
        }
        if (input == 1){
       //     cout << "pi = 1" << endl;
            return false;
        }
    c= input%i;
    if (c==0 || i == 1 ){
     //   cout << "false" << endl;
        return false;
    }
    else if (c!=0 && i<4){
   //     cout << "true" << endl;
        return true;
    }
    }
return 0;
}

int factor(int input){
//    cout << "finput: " << input << endl;
   int i = (input/2) + 1;
    int c;
    int e;
    bool d = false;
    for (i>0; i--;){
  // cout << "fi: " << i << endl;
        c = input%i;
        if (c==0){
        d = prime(i);
        if (d==true){
    //    cout << "found" << endl;
        return i;}
        }
        if (i==1){
  //          cout << "fi = 1";
            return 0;
        }
//cout << "not prime" << endl;
        }
    return 0;
}

int main(){
    int woot;
    cout << "Please insert quater: " <<endl;
    cin >> woot;
    int answer;
    answer = factor(woot);
    if (answer == 0)
    cout << "no prime factors" << endl;
    else
    cout << "answer is: " <<answer << endl;

return 0;
}

Кажется, это работает, пока я не введу действительно большое число, например, число 600851475143, и в этом случае я всегда получаю разные ответы, когда запускаю это число, теперь я почти уверен, что оно просто превышает размер его типа переменной. Теперь я искал и не могу найти правильный тип переменной для такого большого числа, я int и long, кажется, для чисел, которые предназначены для чисел до 4294967295, если без знака, однако это всего 10 цифр, у меня 12 , Какой тип переменной я должен использовать? Или это даже решит проблему? Программа состоит в том, чтобы найти наибольший простой делитель числа (задача Эйлера 3). Любые советы, ссылки или советы будут оценены. И, конечно же, ответ очень ценится! :D


person samuraiseoul    schedule 21.11.2010    source источник
comment
Вы должны переместить первые две проверки внутри вашего цикла за пределы вашего цикла (если вход 2 или 3 возвращает true, а если 1 возвращает false). Вам не нужно проверять это каждый раз, потому что значение input никогда не меняется.   -  person dreamlax    schedule 21.11.2010
comment
Хороший совет! Я возьму это! Есть ли у вас какие-либо идеи, как использовать библиотеки, которые предлагают данные ответы? Я новичок в программировании и никогда не нуждался в реализации библиотеки.   -  person samuraiseoul    schedule 21.11.2010


Ответы (4)


Интересная опечатка!

Это вряд ли будет делать то, что вы думаете...

for (i>0; i--;){

Хотя это вполне допустимый синтаксис, и он будет повторяться правильное количество раз, значение i внутри цикла (вероятно) будет на единицу меньше, чем вы предполагали...

% cat 4237157.c++ 
#include <iostream>

int main() 
{
    {
        std::cout << "Your loop: " << std::endl;
        int i = 10;
        for (i>0; i--;) 
        {
            std::cout << i << std::endl;
        }
    }
    {
        std::cout << "More conventionally: " << std::endl;
        for (int i = 10; i > 0; i--) 
        {
            std::cout << i << std::endl;
        }
    }
    return EXIT_SUCCESS;
}

% g++ -o 4237157{,.c++}

% ./4237157 
Your loop: 
9
8
7
6
5
4
3
2
1
0
More conventionally: 
10
9
8
7
6
5
4
3
2
1

Синтаксис цикла for в C-подобных языках:

for (variable initialization; conditional; variable increment)

Вы оцениваете "i>0" вместо какой-либо инициализации. Это также может быть пустым. Затем вы оцениваете, равно ли i-- нулю. Поскольку i является постдекрементным, ваш цикл начинается с того, что i на единицу меньше, чем он был инициализирован до цикла, выполняется до тех пор, пока (включительно) не станет равным нулю, и затем завершается.

person Johnsyweb    schedule 21.11.2010
comment
Так как же это должно выглядеть для () в этом случае? Я замечал, что это происходит, и компенсировал это, но не был уверен, почему это происходит. - person samuraiseoul; 21.11.2010
comment
Я думаю, что в моем ответе достаточно информации, чтобы даже новичок в программировании мог вывести for (; i > 0; i--). Или (еще лучше) for (; i > 0; --i). Вам также придется отменить все, что вы сделали, чтобы компенсировать это. - person Johnsyweb; 21.11.2010

Многие задачи в Project Euler требуют арифметики произвольной точности, которая не поддерживается стандартной библиотекой C++.

Взгляните на библиотеку больших целых чисел C++.

person Skilldrick    schedule 21.11.2010
comment
Как мне это использовать? Как вставить это в мой код и многое другое? Можете ли вы дать мне представление о том, что для Google? Нравятся библиотеки? Или что-то другое лучше? - person samuraiseoul; 21.11.2010

Если вам нужны произвольно большие числа, вам нужна арифметическая библиотека произвольной точности.

person The Archetypal Paul    schedule 21.11.2010
comment
Как мне получить эту библиотеку? И помещаю это в свою программу. - person samuraiseoul; 21.11.2010
comment
И что мне делать после этого? - person samuraiseoul; 21.11.2010
comment
Вы в основном заменяете все арифметические операции (+, -, *, /, =) вызовами функций. - person Ross; 21.11.2010
comment
@Ross, но многие библиотеки произвольной точности C ++ используют перегрузку операторов, поэтому вы можете использовать тот же синтаксис. - person Matthew Flaschen; 21.11.2010

unsigned long long не является стандартным C++, но большинство компиляторов поддерживает его как расширение. Максимум должен быть не менее 2^64 - 1, что более чем достаточно.

Если позже вам понадобятся еще большие числа, вы можете использовать библиотеку произвольной точности, такую ​​как GMP. У них есть интерфейс C++.

person Matthew Flaschen    schedule 21.11.2010