2

在 C++ 中,我如何计算像 2009^1389 这样的东西?(这是 2009 的 1389 次方,而不是按位异或。)

4

3 回答 3

8

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

如果您实际需要的是确切的整数值,出于某种数论目的:您需要的是一个库,其中包含对非常大的整数进行算术运算的东西。我推荐 GMP (http://gmplib.org)。这样的库将定义用于表示大整数的数据结构,以及对它们进行操作的函数。阅读文档!

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

(鉴于“acm”标签,前者似乎更有可能。)

于 2011-03-09T18:53:57.180 回答
2

你可以看看:GNU 多精度算术库

于 2011-03-09T18:58:53.777 回答
2

这是使用GNU 多精度算术库 (GMP)在 C 中的一个简单实现,因为正如一些人所指出的那样,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,那么 unsigned long int 不能保存高于18446744073709551615. 换句话说,您尝试存储的数字大约是标准类型可以存储的最大整数的 10^4567 倍。我希望这说明了对任意精度算术库的需求:-)

于 2011-03-09T19:19:10.240 回答