2012-02-14 4 views
-1

Это мой код:Ошибка при решении суммы проекта Эйлера номер 3 в C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    long int x = 1; 
    long int res; 

    while (x<600851475143) 
    { 
     x++; 
     if(600851475143%x==0) 
     { 
      res=x; 
      cout<<x<<"\n"; 
     } 
    } 
} 

Я не знаю, что случилось с ним, но он дает мне этот выход:

839 
1471 
6857 
59569 
104441 
486847 
1234169 
5753023 
10086647 
87625999 
408464633 
716151937 
-716151937 
-408464633 
-87625999 
-10086647 
-5753023 
-1234169 
-486847 
-104441 
-59569 
-6857 
-1471 
-839 
-71 
-1 
Floating point exception 

Process returned 136 (0x88) execution time : 156.566 s 
Press ENTER to continue. 

и когда я заменить 600851475143 с 13195 [который был в примере] ... он работает отлично ... и дает мне этот выход:

5 
11 
55 
11149 

Process returned 0 (0x0) execution time : 0.005 s 
Press ENTER to continue. 

Я не знаю, что я делаю неправильно ... :/ Возможно, моя предыдущая программа не запускалась должным образом ... Я попробовал ее с int в начале, а затем изменил ее на long int ... Нет разницы .. .

+1

Вы должны определить проблему, выполнив свою программу с помощью отладчика. –

+0

вы начинаете с 'x = 2', так как вы выполняете' x ++ 'перед модулем'% '. кроме того, вы уверены, что можете упаковать 600851,475,143 в 'long int'? – vulkanino

ответ

2

Отрицательные значения обусловлены переполнением. Начните с использования целых чисел без знака вместо целых чисел. В дополнение к этому, в 32-разрядных компьютерах типы long int и int являются 32 битами.

unsigned long long int x = 1; 
unsigned long long int res; 

Кроме того, вы могли бы подчеркнуть тот факт, что эти константы без знака

while (x<600851475143U) 
    { 
     x++; 
     if(600851475143U%x==0) 
     { 
      res=x; 
      cout<<x<<"\n"; 
     } 
    } 
1

Ваших типы переменных не могут содержать число 12-цифры. Типичный unsigned long int может хранить от 0 до 4 294 967 295, для подписанных - -2,147,483,648 до 2,147,483,647.

2

Когда ваш положительный номер внезапно превращается отрицательным после ++, это верный признак integer overflow. Вам нужно выбрать тип данных, который может содержать большие целые числа, например. long long.

На стороне примечания, ваш алгоритм не ищет самый большой фактор, как требуется в проблеме. Он ищет самый большой коэффициент, который не обязательно является простым.

Кстати, если вы можете доказать, что остановка поиска по достижении квадратного корня из числа, которое учитывается, верна, вы можете значительно ускорить вашу программу.

1

попробуйте использовать unsigned long long, он должен хранить не менее 18,446,744,073,709,551,615 (номер которого я даже не могу себе представить).

1

В приведенном ниже коде будут отображаться все основные коэффициенты числа, введенного пользователем. Но 600851475143 является слишком большим числом, чтобы найти его основные факторы. Измените эту программу, чтобы увидеть основные факторы 600851475143, а также изменить ее, чтобы узнать наибольший первичный коэффициент из них. Я изучил C++ в течение двух месяцев, поэтому я могу помочь вам в этом только. Все самое лучшее.

  #include<iostream.h> 
      #include<conio.h> 
      class primefactor 
       { 
        unsigned long int a; 
        public: 
          void factor(); 

        }; 
      void primefactor::factor() 
       { 
        cout<<"Enter any number to see its prime factors"; 
        cin>>a; 
        int count=0; 
        int count1=0; 
        for(unsigned long int loop1=a;loop1>=1;loop1--) 
         { 
          if(a%loop1==0) 
           { 
           for(unsigned long int loop=loop1;loop>=1;loop--) 
             { 
             if(loop1%loop==0) 
               { 
                count++; 
               } 
             } 
          if(count==2) 
           { 
            count1++; 
            cout<<loop1<<"\t"; 
           } 
          } 
        count=0; 
        } 
         cout<<"\n"<<"There are"<<count1<<"\t"<<"prime factors"; 
       } 

      void main() 
       { 
        primefactor k; 
         clrscr(); 
        k.factor(); 
         getch(); 
        }