【发布时间】:2017-01-29 10:33:56
【问题描述】:
我的任务是找到分数 (a/b) 小数点后第 k 位的数字。
昨天我发现了这个算法。
为了得到小数点后的任何数字,我生成一个名为 rem 的变量并进行循环
for (int i = 1; i <= k+1; i++)
{
rem = a%b;
a = rem*10;
}
cout << a/b;
循环将返回小数点后第 k 位的值。
但是这个任务需要我计算 a,b,k 是非常大的数字(小于或等于 10e18),所以可以肯定代码会超过时间限制。
- 查找重复前的位数。它是分母中 2 和 5 因数中较大的一个。
- 如果 k 不超过位数,则运行 for 循环。
- 否则,我们仍将 for 循环运行到 k+1。将除法余数的值存储在变量 x 中。
- 使用上述相同内容运行 while 循环,直到余数再次具有 x 值。从那时起,将除法的每个商存储到一个数组名 qut 中。
- while 循环终止后,数组将存储repetend 中的每个数字。根据数组内的位数,我们可以计算出第k位。
然而,该算法仍然被证明是耗时的,因为在 a 和 b 是两个连续整数的情况下,repetend 变得非常大。 你能帮我出主意吗?
【问题讨论】:
-
a,b,k 多大?你能指定一个范围吗?
-
如果所有变量都适合 64 位,那么就没有什么可做的了,除非 b 大于 10*b 溢出
-
如果所有变量都是
integers,那么它们怎么可能小于等于10e18??据我所知,c++ 中整数的最高限制(也就是unsigned long int大约是4.29e9。 -
@progy_rock:试试
uint64_t。它不一定存在,但如果存在,它将持有 10e18。