Новый ответ тот же номер? C ++ - PullRequest
0 голосов
/ 21 ноября 2010

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

#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

Ответы [ 5 ]

2 голосов
/ 21 ноября 2010

Интересное оповещение об опечатках!

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

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-подобных языкахis:

for (variable initialization; conditional; variable increment)

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

1 голос
/ 21 ноября 2010

unsigned long                 4294967295
unsigned long long  18446744073709551615

1 голос
/ 21 ноября 2010

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

Посмотрите на C ++ Big Integer Library .

1 голос
/ 21 ноября 2010

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

1 голос
/ 21 ноября 2010

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

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

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