Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c算法-问题_C_Algorithm - Fatal编程技术网

c算法-问题

c算法-问题,c,algorithm,C,Algorithm,我应该使用什么样的算法来计算2^n。其中n始终大于100。建议一个好的算法,使用c:)来计算2^n的log(n)复杂度,您可以执行以下操作(假设type可以存储我们得到的结果): 请注意,如果要在base 2或base 16中打印结果,则解决方案为strightforward。真正的问题是将结果转换为10进制表示 自从n>100,你可能想要一个确切的答案,而Maby你也想要操纵答案,你应该考虑使用一个库。< /P> 是此类库的良好实现。根据,GMP根据操作数大小实现了几种乘法运算(有关这些算法的

我应该使用什么样的算法来计算2^n。其中n始终大于100。建议一个好的算法,使用c:)

来计算2^n的log(n)复杂度,您可以执行以下操作(假设type可以存储我们得到的结果):


请注意,如果要在base 2或base 16中打印结果,则解决方案为strightforward。真正的问题是将结果转换为10进制表示

自从n>100,你可能想要一个确切的答案,而Maby你也想要操纵答案,你应该考虑使用一个库。< /P>
是此类库的良好实现。根据,GMP根据操作数大小实现了几种乘法运算(有关这些算法的详细概述,请参见第16.1节)。

首先确定输出需要的格式。然后找出可以存储信息的数据结构,也可以使用它生成这种输出。我猜你需要某种数组来存储这么大的数字。然后,您需要弄清楚如何将该数组的内容转换为所需的输出格式。当然,你需要弄清楚如何进行数学运算。找出2^n在二进制表示中的含义。当然,如果您的输出是二进制、八进制或十六进制,那么解决方案非常简单。如果它是十进制的,您可能希望数组是十进制数字的表示形式,并实现一些代码,可以像人类一样将十进制数字乘以2倍(如果您想不出更好的答案)。

您可能应该搜索以bigint格式从二进制转换为十进制的算法。请注意,二进制中的数字将表示为

100...00 // n - 1 zeros 
在二进制到十进制之间进行一次转换将比执行
log(n)
bigint
乘法快得多

如果您真的想使用许多乘法,请阅读

编辑:博客文章介绍了一种使用一个双精度浮点变量计算2^1023的方法 左移位(2,n-1)
使用一些bignum包?

如果
n
有一个合理的上限,并且速度是一个关键因素,则预先计算值并将其存储在查找表中。

如果
n
是一个整数,只需左移
1
n
次即可。对于较大的
n
,普通换档操作将不够


如果
n
是双精度的,使用
math.h

中的
exp2(n)
得到什么结果
double
bigint
?这更多的是关于正确的数据类型的问题,而不是算法的问题。我刚刚完成了大整数的长乘法函数的编码;我希望我以前听说过Karatsuba乘法。在封面下,二进制到十进制的转换几乎肯定是O(n)。它是通用的,所以它本身不知道只设置了1位。即使它确实知道,它也无法比@Vladimir的O(log(n))解决方案(顺便说一句,它被称为“连续平方”或“二进制指数”)更有效地计算2的一次幂。关于我计算2^1023的程序(感谢您的参考),它是O(n)。它计算的是一系列的二次幂,而不是一个单独的二次幂。然而,这确实意味着@Vladimir的算法在不使用bigint的情况下可以工作到2^1023@里克:我曾多次使用“逐次平方”技术,但我建议执行基址转换可能比执行n次简单乘法更快。我得核实一下我的臀部。顺便说一句,当n=1023:)时,您可能不会感觉到O(n)和O(log(n))之间有太大的差异。您确实说过“在二进制到十进制之间进行一次转换将比执行bigint的log(n)乘法快得多”。我只是对此作出回应。
100...00 // n - 1 zeros