我正在尝试编写一个程序,要求将5 ^ 30的幂存储到int中,但是当我尝试执行此操作时,它给出的输出为负数。 可以使用双倍或长倍
正常运行#include <stdio.h>
int PowerFive(){
int a, i, n=5, e=1;
for (i = 0; i<=30; i++)
{
a=e;
printf("%d, ", e);
e = e*n;
}
return 0;
}
int main()
{
PowerFive();
}
答案 0 :(得分:0)
您不能; int
具有固定大小。
long
可能比int
大,但看起来您需要64位以上才能获得正确答案。在这种情况下,最好的选择是使用__int128
。
答案 1 :(得分:0)
int
,long
,double
,...的位数/字节取决于实现/平台。
因此,在某些平台上,此功能可能不适用于long
。
关于“它与double
一起工作”的注释:通常,对于double
或float
,您可能认为它起作用,但是答案可能是错误的:四舍五入为一个值接近正确答案。
您必须实现自己的big-int代码,该代码使用3个(或更多)int
。
答案 2 :(得分:0)
增大int的大小
编译器有时会提供int
大小的控件,但通常会将其固定为32、16、64,..位的目标系统。它必须至少为16。
存储5 ^ 30的值
5 30 是931322574615478515625(70位数字)。
C没有指定足够宽的整数类型,尽管某些系统确实支持128位整数。
缺少128位整数来存储该整数值需要使用另一种方法。存在各种任意宽度的库。
快捷方式是使用 string -效率不高,但是可以完成工作。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
char *strmult(char *s, size_t size, unsigned char m) {
size_t len = strlen(s);
if (len >= size) {
return NULL;
}
int carry = 0;
for (size_t i = len; i-- > 0;) {
if (!isdigit((unsigned char ) s[i])) {
return NULL;
}
int sum = (s[i] - '0') * m + carry;
s[i] = sum % 10 + '0';
carry = sum / 10;
}
if (carry) {
if (len + 1 >= size) {
return NULL;
}
memmove(s + 1, s, len + 1);
s[0] = carry + '0';
}
return s;
}
int main(void) {
char s[100] = "1";
for (int i = 0; i < 30; i++) {
strmult(s, sizeof s, 5);
}
puts(s);
}
输出
931322574615478515625