Большие показатели в C ++ - PullRequest
2 голосов
/ 09 марта 2011

В C ++, как я могу вычислить что-то вроде 2009 ^ 1389?(Это 2009 год, возведенный в 1389-ю степень, а не битовый XOR.)

Ответы [ 3 ]

8 голосов
/ 09 марта 2011

Простой ответ: Вы не можете.То есть: 2009 ^ 1389 - это слишком большое число, чтобы вписаться в любой из числовых типов, доступных вам в C.стандарт языка C намеренно довольно неопределенен в этих вещах, но на практике вы этого не делаете.)

Если вам действительно нужно точное целочисленное значение, для некоторой теоретико-числовой цели: вам нужнобиблиотека, содержащая материал для выполнения арифметики с очень большими целыми числами.Я рекомендую GMP (http://gmplib.org).. Такая библиотека будет определять структуры данных для представления больших целых чисел и функции для работы с ними. Прочитайте документацию!

Если вам действительно нужно приблизительное значение: возможно, вы можете работать слогарифмы всех чисел, о которых вы заботитесь, в этом случае #include <math.h> и используйте тот факт, что log (a ^ b) = b log a.

(первое кажется более вероятным с помощью тега "acm".)

2 голосов
/ 09 марта 2011

Вот простая реализация на C, использующая Многопрецизионную арифметическую библиотеку GNU (GMP) , поскольку, как указывалось несколькими людьми, 2009 ^ 1389 слишком велик, чтобы его могли удерживать любые стандартный целочисленный тип (или типы с плавающей запятой):

#include <stdio.h>
#include <gmp.h>

int main(int argc, char** argv)
{
  mpz_t result;
  mpz_init(result);
  mpz_ui_pow_ui(result, 2009, 1389);
  mpz_out_str(NULL, 10, result);
  printf("\n");
  mpz_clear(result);
  return 0;
}

Выход:

6904498559121309802308352536636656916841485881249127760411444121454287106675657792876060534112006105537485278403965358803419890126770116818480304122865992931625716387995049853214462120105608999553621198813324599818009380239818031156834487367339326786340403087807781404433713320193709739525327786598750140070892760632928707173645499268471061233180463349380442559816425949747566365224628436780514647641764639558383480817012524482674250721602185962467627962429907364437817311479049832165553708636986151929995991207565845005368889324879308330206689885399265696398032240551294522222894503586978677455037963143849606983685620145045535571746453287973925064967135695183081953811860731029972314741397749240206841764867164188616738958409049376353415278828871205762177456998483038152939970953958461474229598384107111691607875252192597315683686848387652376594721904526432225577507570258381867217377677513337894918263847218425136171892621510727811453512715918742636055516729961487614304071690500810153984891177135437153784322151648403932070612668171406418897771544045285457793857718660832826443416076694943418135848234480395201464191429577857466224158252723565798949069003262065961024045584332257194800000669090923240388468237009176827811688075832605017651501561517948708202432871443612540314105831535588113595555999472777337050805744665826246058057320722922714651771208602977774561962977918625812289087251602684421661228334336365305215952690347416947710192765433678852717800912640628571258392484241793055838180491619930498901043639229278726726656096146257705138286701796826044964046436144665794835661302071333016380652066997980551520875447011163999019506110980834735687945650462179667554513197693671515055655557660671740294186325639037487693767798133792692592902787247406776471847067697955756584131854986676506049707757416991674573856352513572890014627018199149335298405004432074086477494536652914709865925877875671670470234182752651415567516565630694284655210303690376757832913114266573714644074252401618591223303434864294923024672481988833239416645678544952884127969516024214811670878271050013322064134853584892325432064185744479312827424471423586989496853776759458883660912092654144885542193916049874089053856995260240299970163311761771885947583355950786811990299220231970504348637469283159788768101357123182816933686768982852076788962033980997046896868118125302133525473738409855773337071262937224785367775222645757483372493069570309868330655972165099469327165288548822159504651326426914736264019448954548004753029218407430396726651895754036910807617823823989375303893545359176949790052688850142099930096136924290507499368719092451318615608655867254672816340193953979233790088651813653721235225803521442534942946566612393025183550241802037214923433668564350506190568931355661811092641896437013892205773430521378705682087445677842709428628288423549467330572155806059402702418465096006810502041444134333223786660673419122531277550126018271079201170482768002860411814993510265276064998836067222764664332142956014324419388013066259680739193612561526241083193455521640117886366802222483606638680650584608279089145204414803833631357245610099519646835951413308606876581747869944529500610903575675152840322645670278576547312137841352653274207409392088891049096886470610862554019233221898584217214321026370525853059476425774684196488248067808264113132706932857171808059003259122602076178390199335816920980821161524087845466828637296776402370575983085339402431288131136340977674837073070317727286253135572665954464119645509648830113966087976377624259668032543073585876871164745866575945754855981882683126843274035153400895303797566991022270058921603916552708481597293681260438785977724631879360116075459335535060125487103664611798932202712910466097771915540014306040167383725463461657027399148667981288553406424943734348513154878733251882413766250177455897104027833119949635736337035212579912144077565940453409369101772290655783535071701607694969027634670357462049652019263788447216772168042495002372065676827140080229530009583538213750226126977325769120646316120369474456782228442789922887585270509188450091128211138769641529879236350735193946499179562222382124912384687477913206474543509513531382462231559362959023718202564331720895534115077042499114493637645022335265142086970527644591300720423405562268355214515177491815629653685229906639766868183941639969698449100497467609606422363945390182911783050828696100427797981928668412278817760632665048171064221674492079214541380015937129053461666707938779755603551664011967154902179505540633143719102060220140801520569508458962865952235217687263319269959289

Для сравнения, обратите внимание, что long int обычно составляет 4 или 8 байтов. Если это 8, то беззнаковое длинное целое не может содержать числа выше 18446744073709551615. Другими словами, число, которое вы пытаетесь сохранить, примерно в 10 ^ 4567 раз больше, чем наибольшее целое число, которое можно сохранить стандартными типами. Я надеюсь, что это иллюстрирует необходимость арифметической библиотеки произвольной точности: -)

2 голосов
/ 09 марта 2011
...