Задача
Даны два целых числа a, b, a Пример ввода
3 7
345 800
112 990
53 122
Пример вывода
.428751
Последние 6 цифр повторяются навсегда.
.43125
Это расширение прекращается.
.113
Последние 2 цифры повторяются вечно.
.4344262295081967213114754098360655737704918032786885245901639
Последние 60 цифр повторяются навсегда.
Примечание. Эта проблема является исходной для конкурса программ ProgFest.
Алгоритм этой задачи не сложен, если мы применим эти три теоремы:
Однако проблема, с которой я сталкиваюсь, заключается в округлении при вычислении альфа с использованием рекурсивной формулы, приведенной в теореме 1. Функция отображения определяется следующим образом:
void displayFraction( int n, int d, int length ) {
std::cout << ".";
double alpha = static_cast<double>( n ) / d;
for( int i = 1; i <= length; ++i ) {
int c = std::floor( 10.0 * alpha );
alpha = 10.0 * alpha - c;
std::cout << c;
}
}
И мой вывод был:
.4344 2622 9508 1967 3732 7807 5683 6291 4025 7835 3881 8359 3750 0000 0000 0
, где вывод проблемы был:
.4344 2622 9508 1967 2131 1475 4098 3606 5573 7704 9180 3278 6885 2459 0163 9
Как вы можете видеть, это было верно до 16-й цифры.Поэтому мой вопрос заключается в том, как я могу предотвратить усечение цифр при выполнении вычисления в этой конкретной ситуации?Есть идеи?