Я хочу, чтобы создать приложение, которое генерирует полный список телефонных номеров, что удовлетворяет equatation:Почему двойной отрицательный, когда он должен быть положительным?
x
является рациональным числом.
Мы можем предположить, что
Теперь, после некоторых преобразований получим
Как 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;
}
}
}
}
переполнением. Добавить проверку для отрицательных значений? –
Я бы избегал арифметики с плавающей запятой для этого упражнения и использовал 64-битные целые числа. 32-разрядное целое не будет содержать полный диапазон 9-битных чисел, но 64-битный. –
Также вы должны использовать концепцию Greatest Common Divisor (GCD). Есть очень эффективные алгоритмы для его вычисления, и Google поможет вам найти их. –