如何增加int的大小,以便可以在其中存储5 ^ 30的值

时间:2019-04-13 22:20:53

标签: c linux

我正在尝试编写一个程序,要求将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();
}

3 个答案:

答案 0 :(得分:0)

您不能; int具有固定大小。

long可能比int大,但看起来您需要64位以上才能获得正确答案。在这种情况下,最好的选择是使用__int128

答案 1 :(得分:0)

intlongdouble,...的位数/字节取决于实现/平台。

因此,在某些平台上,此功能可能不适用于long

关于“它与double一起工作”的注释:通常,对于doublefloat,您可能认为它起作用,但是答案可能是错误的:四舍五入为一个值接近正确答案。

您必须实现自己的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