2013-12-23 2 views
3

Я хочу, чтобы создать приложение, которое генерирует полный список телефонных номеров, что удовлетворяет equatation:Почему двойной отрицательный, когда он должен быть положительным?

Equatation

x является рациональным числом.

Мы можем предположить, что

x=s/t

Теперь, после некоторых преобразований получим

Equatation

Как telephone number является целым числом и 10^9 является целым числом, мы знаем, что t * 666333999/s является целым числом. Поэтому s является делителем t * 666333999

Пока моя программа ищет все делители 666333999. Я думаю, что это должно быть хорошо (это должно написать большинство телефонных номеров). К сожалению, иногда мой номер телефона (это переменная tym) является отрицательным числом.

Почему это так?

Вот мой код.

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector <unsigned> divisor; 
    const int number = 666333999; 
    long double tym;      // it's the phone number (9 digits) 
    for (int i = 2; i < number + 1; i++) 
    {        // I'm pushing all the divisors to vector. 
     if (number % i == 0) 
     { 
     divisor.push_back(i); 
     } 
    } 

    for(unsigned i = 1; i < divisor.size() + 1; i++) 
    {          // i are consecutives values of s 
     for(unsigned j = 1; j < (unsigned)2000000000; j++) 
     {         // j are consecutives values of t 
      tym = number/divisor[i]; 
      tym *= j; 
      if(tym > 99999999 && tym < 2000000000) // I must substract 10^9 
      { 
       cout << "\t(!)\t i = " << i << " and j = " << j << "," 
         "div[i] = " << divisor[i] << ", telephone" 
         " number = " << (tym - 1000000000) << endl; 
      } 
      else if(tym >= 2000000000) 
      { 
       break; 
      } 
     } 
    } 
} 
+1

переполнением. Добавить проверку для отрицательных значений? –

+5

Я бы избегал арифметики с плавающей запятой для этого упражнения и использовал 64-битные целые числа. 32-разрядное целое не будет содержать полный диапазон 9-битных чисел, но 64-битный. –

+0

Также вы должны использовать концепцию Greatest Common Divisor (GCD). Есть очень эффективные алгоритмы для его вычисления, и Google поможет вам найти их. –

ответ

3

Число участвующих в вашем вычислении превышает возможности 32-битного целого числа, но может соответствовать 64-битным целым числам.

Может быть на вашей платформе int 32 бит. Просто используйте long long.

Если вы хотите, чтобы быть уверенным в 64 бит, используйте std::int64_t, определенный в <cstdint>

Смежные вопросы