C ++中的大型指数

时间:2011-03-09 18:42:13

标签: c++ largenumber exponentiation

在C ++中,我如何计算像2009 ^ 1389这样的东西? (那是2009年提升到1389的权力,而不是按位异或。)

3 个答案:

答案 0 :(得分:8)

简单回答:你做不到。那就是:2009 ^ 1389是一个太大的数字,不适合你在C中可用的任何数字类型。(严格来说,它可能可能,你可能有百万位的整数或浮点数或其他东西,因为C语言标准对于这些事情是故意相当无限的,但实际上你没有。)

如果你真正需要的是精确的整数值,那么出于一些数论的目的:你需要的是一个包含在非常大的整数上进行算术的东西的库。我推荐GMP(http://gmplib.org)。这样的库将定义用于表示大整数的数据结构,以及用于对其进行操作的函数。阅读文档!

如果您真正需要的是近似值:也许您可以使用您关注的所有数字的对数,在这种情况下#include <math.h>并使用log(a ^ b)= b log a的事实

(前者似乎更可能是“acm”标签。)

答案 1 :(得分:2)

答案 2 :(得分:2)

这是C中的一个简单实现,使用the GNU Multiple Precision Arithmetic Library (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,则无符号long int不能保存高于18446744073709551615的数字。换句话说,您尝试存储的数字大约是可以使用标准类型存储的最大整数的10 ^ 4567倍。我希望这说明需要一个任意精度算术库: - )