Как мне увеличить размер int, чтобы я мог сохранить в нем значение 5 ^ 30 - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь написать программу, и требование состоит в том, чтобы сохранить мощность 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 голосов
/ 14 апреля 2019

Количество бит / байтов int, long, double, ... зависит от реализации / платформы.

По этой причине на некоторых платформах это может не работать с long.

Примечание о том, что «оно работает с double»: в целом, с double или float вы можете подумать, что это работает, но ответ может быть неправильным: округлено до значенияблизок к правильному ответу.

Вы должны реализовать свой собственный код big-int, который использует 3 (или более) int s.

0 голосов
/ 05 июля 2019

увеличить размер типа 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);
}

Output

931322574615478515625
0 голосов
/ 14 апреля 2019

Вы не можете; int имеет фиксированный размер.

long может быть больше, чем int, но, похоже, вам нужно более 64 бит, чтобы получить правильный ответ. В этом случае вам лучше всего использовать __int128.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...