Cha*_*han 5 c++ algorithm double numbers
问题
给出两个整数a,b,a <b.显示其十进制扩展.您将打印给定的整数商的十进制扩展,就像扩展终止时一样停止,或者就像重复模式第一次重复一样.如果存在重复模式,您将说明重复模式中有多少位数.样品输入
3 7
345 800
112 990
53 122样本输出
.428751
最后6位数字永远重复.
.43125
此扩展终止.
.113
最后2位数字永远重复.
.4344262295081967213114754098360655737704918032786885245901639
最后60位数字永远重复.
注意:此问题是ProgFest编程竞赛的原始问题.
如果我们应用这三个定理,这个问题的算法并不困难:

然而,我所面临的问题是使用定理1中给出的递归公式计算alpha时的舍入.显示函数定义如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:
.4344 2622 9508 1967 3732 7807 5683 6291 4025 7835 3881 8359 3750 0000 0000 0
Run Code Online (Sandbox Code Playgroud)
问题输出的地方是:
.4344 2622 9508 1967 2131 1475 4098 3606 5573 7704 9180 3278 6885 2459 0163 9
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,直到第16位才是正确的.所以我的问题是,在这种特殊情况下执行计算时如何防止截断数字?任何的想法?
问题是它double没有无限的精度,而是只能管理大约 16 位十进制数字。这就是你遇到麻烦的地方(有趣的是!),因为输入中double显示出根本缺乏信息。
你需要找到一种解决问题的方法,当你从中得到更多的数字时,它就会越来越接近答案。这意味着您需要更多地考虑定理 3,并且还需要根据有理数而不是浮点来编写代码。
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |