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

l2osamch  于 2022-09-19  发布在  Linux
关注(0)|答案(3)|浏览(149)

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

6ss1mwsb1#

增加int的大小

编译器有时提供int大小的控件,但通常将其固定到目标系统为32、16、64、..比特。它必须至少有16个。

存储5^30的值

530是931322574615478515625,一个70位的数字。

C没有指定足够宽的整数类型,尽管有些系统确实支持128位整数。

缺少128位整数,存储该整数值需要一种不同的方法。存在各种任意宽度的库。

速战速决就是使用字符串--效率不是很高,但可以完成工作。


# include <ctype.h>

# include <stdio.h>

# include <stdlib.h>

# include <string.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;
  }
  while (carry) {
    if (len + 1 >= size) {
      return NULL;
    }
    memmove(s + 1, s, len + 1);
    s[0] = carry + '0';
    carry /= 10;
  }
  return s;
}

int main(void) {
  char s[100] = "1";
  for (int i = 0; i < 30; i++) {
    strmult(s, sizeof s, 5);
  }
  puts(s);
}

输出

931322574615478515625
9gm1akwq

9gm1akwq2#

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

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

hk8txs48

hk8txs483#

intlongdouble、...依赖于实施/平台。

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

关于‘It Works with double’的注解:一般来说,对于doublefloat,您可能认为它有效,但答案可能是错误的:四舍五入到接近正确答案的值。

您必须实现自己的大整型代码,该代码使用3个(或更多)e1d7d1。

相关问题