我的任务有点问题。用户输入X(整数1 <= x <= 10000)。然后我必须用x计算2的幂,将答案的所有数字加在一起并输出给用户。因此,例如,如果用户输入4将是2 ^ 4 = 16. 1 + 6 = 7.但是这不适用于大整数,因为2 ^ 10000太大而无法存储所以我假设我必须使用一个数组。
我得到了这个概念,我只需要加倍2'x'次来得到答案,但我不知道如何将它存储在一个数组中以及如何处理当说8加倍时你会得到16 ,你需要长时间的乘法运载不是吗?
感谢收到的任何帮助。
总的来说,我的问题是:
scanf("%s")
并存储在数组中吗?答案 0 :(得分:0)
是的,你需要携带/数组来存储大整数;这就是GMP的工作原理。
这并不像听起来那么难以实现。在使用汇编时,特别是x86
,甚至还有特殊说明(adc
,sbc
)来设置进位标记(CF
)。
在C中,您不能使用这些,但不幸的是,这是GMP
的作用。作为一组提示,这里有一些:
#include <stdint.h>
如果您可以使用(C99),则可以保证整数的宽度,例如: uint32_t
。这有效:
uint64_t x = (uint64_t) a + (uint64_t) b;
其中a和b为uint32_t
。
如果您仔细考虑上述陈述,可以根据需要从x
中提取差价。
对于大整数的存储,在学校你可能已经研究过“数百,数十和单位”,即填充桶直到达到10的概念,然后进行携带。与使用大小为2^32
的整数做同样的事情没有什么不同,除非它看起来有点不自然!
答案 1 :(得分:0)
1。
阅读输入应该不是问题。如您所知,1&lt; = x&lt; = 10000,您可以照常阅读:scanf("%d", &x);
。
2。
由于您不允许使用bignum图书馆,为什么不自己制作?您可以在int
s或char
s的数组中逐位存储大量数字。从这样的事情开始:
int product[100] = { 1 };
也就是说,您最初在产品中存储2 ^ 0 = 1。然后你可以从左到右执行乘法运算:将pruduct
的每个元素乘以2,模数为10.如果发生进位,则将其添加到下一个元素。
完成后,找到从右到左搜索最重要的数字。然后反转数字,或者只是以相反的顺序打印它们。您还可以将标记用于最重要的一端。只要在最重要的数字中发生执行,标记就会递增。
可以通过为每个元素存储多个数字来减少数组大小,例如,每个元素6个数字。然后你需要将每个元素乘以2,模数为1000000。
代码将是这样的:
for(p = 0; p < x; p++)
{
carry = 0;
for(i = 0; i < 100; i++)
{
z = product[i] * 2 + carry;
product[i] = z % 10;
carry = z / 10;
}
}
for(i = 99; product[i] == 0; i--);
for(; i >= 0; i++)
printf("%d", product[i]);