【发布时间】:2020-08-31 20:18:06
【问题描述】:
我有一个整数n 代表一个数字乘以1e<exp> 得到某个常数<exp>。例如,对于 12.345 的输入数字和 4 的 <exp>,n = 123450。我想尽快输出没有尾随零的原始数字。
一些潜在的(但有缺陷的)解决方案:
// Pros:
// - Very simple
// - Does not output trailing zeros
// Cons:
// - Converts to float (slow, inaccurate)
printf("%g", n * 1e-<exp>);
// Pros:
// - Quite simple
// - Uses only integer arithmetic
// Cons:
// - Outputs trailing zeros
printf("%d.%.0<exp>d", n / (int)1e<exp>, n % (int)1e<exp>);
【问题讨论】:
-
我们调用
e。 e的范围是多少?会不会是 n•10^-e 小于 1?小于 0.1?会不会是负面的? n的范围是多少?会不会是负面的?会不会是零?如果 e 是一个常数,您是否希望它的每个可能值都使用不同的代码,如果这样可以缩短时间?如果数字是 100,你想要“100.”、“100”还是“1”(没有尾随零)? -
@EricPostpischil 在这种特定情况下,n 将是正数并且 >=1,但是更通用的解决方案将是理想的。理想情况下,该解决方案可以很容易地修改为不同的 e 值,但不会以速度为代价。如果数字是 100,则输出应该是“100”或“100.0”,尽管是“100”。如果它提供显着的速度增加是可以接受的
-
请回答所有问题。询问 n^−e 是否小于 0.1 是有原因的。如果不能,我们可以将 n 转换为字符串,打印其中的一些数字,打印小数点,并打印更多的数字,直到尾随零开始的位置。如果可以,我们需要先打印一个小数点,然后再打印一些零,这需要计算 n 的大小(这可能在转换为字符串时发生,但这可能意味着不调用库例程来执行此操作)。再说一遍,e 是否可以使 10^-e 小于 0.1? n的范围是多少?可以是负数吗?
-
@EricPostpischil 抱歉,我在之前的评论中不小心写了 n。 n*10^-e 为正且 >=1。 n 的上限是 2^64-1
-
第三种可能是自己提取数字,并用
putchar输出。 "as fast as possible" 和 "printf" 的组合是矛盾的。
标签: c printf fixed-point