C ++ Сумма чисел, введенных пользователем менее 10 миллиардов [дубликат]

Начать здесь:

var b = 'bee';
console.log(b);  // global

Поместить его в функцию и больше не глобально - ваша основная цель.

function a() {
  var b = 'bee';
  console.log(b);
}
a();
console.log(b);  // ReferenceError: b is not defined -- *as desired*

Вызовите функцию немедленно - oops:

function a() {
  var b = 'bee';
  console.log(b);
}();             // SyntaxError: Expected () to start arrow function, but got ';' instead of '=>'

Используйте круглые скобки, чтобы избежать синтаксической ошибки:

(function a() {
  var b = 'bee';
  console.log(b);
})(); // OK now

Вы можете оставить имя функции:

(function () {    // no name required
  var b = 'bee';
  console.log(b);
})();

Это не должно быть более сложным, чем это.

2
задан Shawn Mclean 9 February 2010 в 19:40
поделиться

8 ответов

long long может содержать до 9223372036854775807. Используйте что-то вроде gmp , если вам нужно больше.

14
ответ дан Ignacio Vazquez-Abrams 22 August 2018 в 08:52
поделиться
  • 1
    +1 - long long - 8 байтов в GCC и VC ++ независимо от платформы – Manuel 9 February 2010 в 20:00
  • 2
    @PotatoSwatter: Неправильно - в обоих стандартах, которые определяют его (C99 и C ++ 0x), это 64 бит minimum . Не было бы смысла добавлять 32-битный минимальный тип; мы уже имеем long. Кроме того, int64_t в значительной степени по определению NOT FASTER, чем long long, поскольку последний тип имеет меньше требований (в частности, длинный длинный может быть более 64 бит) – MSalters 10 February 2010 в 11:21
  • 3
    Конечно: если собственный целочисленный формат составляет 128 бит, то «точно 64 бит» type требует, чтобы операция &= 0xFFFFFFFFFFFFFFFF была вставлена ​​во многие моменты. Более распространенным примером, где более низкая точность является более медленной для загрузки, является 64/80 бит операций FP на x87. – MSalters 11 February 2010 в 10:48
  • 4
    @MSalters: Я рассматриваю §3.9.1 в N3000 и ничего не вижу о конкретных требованиях к размеру чего-либо. Вместо этого для него требуется typedef int_least64_t (§18.4.1). Это кажется совершенно несовместимым с вашим утверждением. Кроме того, выборка 64-битного числа всегда будет быстрее (время амортизации), чем выборка 128 бит, независимо от того, что делает ALU. – Potatoswatter 11 February 2010 в 21:47
  • 5
    @Potatoswatter: это приложение E в стандарте C99: «Показанные минимальные величины должны быть заменены значениями, определенными реализацией, с одинаковыми знаками». И для этого требуется LLONG_MAX >= +9223372036854775807 и LLONG_MIN <= -9223372036854775807, следовательно, минимум для 64 бит для long long. – Ben Voigt 8 September 2013 в 17:09

Вы можете использовать длинный int:

long int a

Или, если он всегда будет положительным, unsigned long int:

unsigned long int a

См.: http : //forums.guru3d.com/showthread.php т = 131678

-1
ответ дан akiller 22 August 2018 в 08:52
поделиться

Просто обратите внимание, что оба int64_t и long long включены в C99 и в C ++ 0x, но не в текущей версии C ++. Таким образом, использование или делает ваш код подверженным риску быть не переносным. Реально, однако, что риск, вероятно, уже довольно низок - до такой степени, что когда / если вы портируете свой код, скорее всего, будут гораздо большие проблемы.

Если, однако, вы действительно хотите заверить против этой возможности вы можете рассмотреть возможность использования двойной точности с плавающей запятой. Вопреки распространенному мнению, типы с плавающей точкой могут представлять целые числа точно до определенного предела - этот предел устанавливается (по существу) на размер мантиссы в F.P. тип. Типичная реализация double имеет 53-битную мантиссу, поэтому вы можете представлять 53-битные целые числа с абсолютной точностью. Это поддерживает номера до 9 007 199 254 740 992 (что значительно превышает 13 из либо популярных значений «миллиард»).

2
ответ дан Jerry Coffin 22 August 2018 в 08:52
поделиться
  • 1
    Каков тип данных, который я бы использовал для этого 53-битного? удваивать? – Shawn Mclean 9 February 2010 в 20:32
  • 2
    @Shawn: да. Конечно, вы должны быть осторожны - например, если вы разделите два из них, вы получите деление с плавающей запятой, а не целочисленное деление ... – Jerry Coffin 9 February 2010 в 20:33
  • 3
    @Shawn: вы столкнетесь с большим количеством проблем с переносимостью, требуя FPU, а не за счет возможности выполнять 64-битную математику. – Potatoswatter 10 February 2010 в 03:21
  • 4
    @Potatoswatter: Хотя это правда, что аппаратные средства меняются, у нас остается один простой факт: каждая соответствующая реализация C ++ must включает double, а double must поддерживает не менее 10 цифры точности. Напротив, для поддержки 64-разрядного целочисленного типа требуется компилятор no C ++. Даже в C ++ 0x int64_t будет необязательным , не требуется. Если вы пишете код для Microchip PIC (например), у него может отсутствовать FPU, но он, вероятно, тоже не поддерживает int64_t. Некоторая поддержка для соответствующего двойника намного более распространена, чем поддержка int64_t. – Jerry Coffin 10 February 2010 в 05:40
  • 5
    Реализация double не имеет значения. double должен иметь не менее 12 значащих цифр, независимо от точного представления. 13 миллиардов занимает всего 11 цифр. – MSalters 10 February 2010 в 11:26

Используйте int64_t , чтобы гарантировать, что вы не будете переполняться. Он доступен из stdint.h .

6
ответ дан Matthew Flaschen 22 August 2018 в 08:52
поделиться
  • 1
    int64_t не гарантирует это вообще! Вы можете также превысить его емкость. – Seth Johnson 9 February 2010 в 19:47
  • 2
    & Quot; вы & Quot; как в ОП, который хранит до ~ 13 миллиардов. Очевидно, что int64_t все еще может переполняться. – Matthew Flaschen 9 February 2010 в 19:52

просто используйте double в заявлении декларации

0
ответ дан Nishadh 22 August 2018 в 08:52
поделиться

Хорошая идея понять пределы диапазона для разных типов.

32-битный тип (на большинстве 32-разрядных платформ, как int, так и long 32 бит) имеют следующие диапазоны:

signed: -2,147,483,648 to 2,147,483,647
unsigned: 0 to 4,294,967,295

В то время как 64-битные типы (обычно длинные - 64 бит, на большинстве 64-разрядных платформ Unix - 64) имеют следующий диапазон:

signed: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned: 0 to 18,446,744,073,709,551,615
1
ответ дан R Samuel Klatchko 22 August 2018 в 08:52
поделиться
  • 1
    Я думал, что долгое время VC ++ было 64 бит также в 32-битной Windows? – Manuel 9 February 2010 в 20:05
  • 2
    @Maneul - это, позвольте мне уточнить это. – R Samuel Klatchko 9 February 2010 в 20:08

Тип данных (int) слишком мал, чтобы хранить такие большие числа. Вы должны использовать более крупный тип данных или один из типов данных фиксированного размера, как указано в другом ответе (хотя вы действительно должны использовать uint64_t, если вы не используете отрицательные числа).

1
ответ дан Stephen Cross 22 August 2018 в 08:52
поделиться

unsigned long long

можно использовать

-1
ответ дан user3320035 22 August 2018 в 08:52
поделиться
  • 1
    Вам нужно добавить более подробную информацию, пример и, возможно, ссылку на некоторую документацию – Bill 17 February 2014 в 19:17
Другие вопросы по тегам:

Похожие вопросы: