如何使用pow()函数计算C ++中超过2 ^ 32的幂?

时间:2016-02-12 22:46:41

标签: c++ pow cmath

我写了一个简单的程序:

#include<iostream>
#include<cmath>
int main()
{
  int t, n;
  int count = 0;
  std::cin>>t;
  for(int i = 0; i < t; i++)
  {
    std::cin>>n;
    int num = n;
    while(num > 0)
    {
      num = num/2;
      count++;
    }
  }
  std::cout<<"\n count "<<count<<std::endl;
  std::cout<<pow(2, count-1)<<std::endl;
  return 0;
}

在这里,我希望我的程序能够用于输入

t = 1 n = 1000000000000000 (10^15)

现在当我使用此输入时,程序的输入缓冲区永远不会结束(即关闭程序,我们必须按ctrl + c)。我猜电源功能有问题。所以我想知道如何在c ++中避免这种情况。

我想知道是否可以在C ++中计算2^32的值?通过pow()或通过任何其他手动方法。

2 个答案:

答案 0 :(得分:1)

<强>问题

您正在使用没有足够空间存储大于2 ^ 32的值的数据类型。

<强>解决方案

使用可以存储大于2 ^ 32的值的数据类型。尝试使用long long代替int。这些数据类型的大小取决于您的编译器。

#include<iostream>
#include<cmath>
int main()
{
  long long t, n;
  long long count = 0;
  std::cin>>t;
  for(long long i = 0; i < t; i++)
  {
    std::cin>>n;
    long long num = n;
    while(num > 0)
    {
      num = num/2;
      count++;
    }
  }
  std::cout<<"\n count "<<count<<std::endl;
  std::cout<<pow(2, count-1)<<std::endl;
  return 0;
}

如果您不需要负值,则可以通过声明long long来增加intunsigned可以容纳的最大值。

答案 1 :(得分:0)

它适用于powpowl。值大于2^32,但您需要知道这里我们使用尾数:

#include <iostream>
#include <iomanip>
#include <cmath>

int main() {
  using namespace std;

  cout << sizeof(int) << endl;

  int n = 1024 - 1;
  cout << fixed << setprecision(0) << pow(2,n) << endl;
  cout << sizeof(pow(2,n)) << endl;

  n = 1024 * 16 - 1;
  cout << fixed << setprecision(0) << powl(2,n) << endl;
  cout << sizeof(powl(2,n)) << endl;

  return 0;
}

输出:

4
89884656743115795386465259539451236680898848947115328636715040578866337902750481566354238661203768010560056939935696678829394884407208311246423715319737062188883946712432742638151109800623047059726541476042502884419075341171231440736956555270413618581675255342293149119973622969239858152417678164812112068608
8
594865747678615882542879663314003565381722343548255118736337410616630679090241843452244297736306019957557718742419654629448833690654343713137262349170782503040435817183002448761071625809765723422976172854741067923518323732415492392357140483922807069238022169202443061452643427656618079347999942895053178509060407681660390482161856378582145306703437601208682661975133940044533758686135305417823772877890396715811106725951908929815345155671925328769680324822596641589145883829482702642556778067184896640862944007954207337644916269031709617444299949490311557012560837236025936219660661599201471352670683475637369507296908449144497222586700182308964188569037205672895924286797538585218822095871944822442688842369161120304119539530699737837667369892008245871310742614507423836167988948579198667113174867405720826538879125494463015447394802338076552128630070903411513794001720975727663850799035640794798584706982804219752491585627531141013313100024021074904100001030496716840618811928940313739863536438741419219352524017082316668506692702999020350954331193650802509094131286861883139620399465858854403950870132703965488209824438934802008758845969343994044004472125629413484844182097066972890078922182473026356827727453163593714265947550139347559661748404351815218096963796346172410406417148682239343431032084521229277568266027525254094945933423431899958823773645685786750350507598779548726520016515760341759108247097818348038874055299142450671805734607137060905247538989637778322582491925031025533258542323684732018320284669732418586091676478436956021320001805809394639097855026047281380653351775920165055322550997717583813344334813881910302171240178953207677106366473378036503453544435248062525034078329626380648832032749173746330899412031156105204637292282793632423208825080061587937017363130978644540733098825776915372212354849317376813885178113563072526274562614724020074557397840679937984256404287622135935727727042447493077510397403490469607829027659582820840552983227079975738454291564860751649408292571036530740444010884909169208564698439185729787923026291571464223624851849274062647887960468225011325713624974790354101983041423775460945576066660524005986941818288912766662994426078162719667510657656067040695225510627681853951747958481562962100583938595054467627957269744108448558971634686804319537236396375558357563553198212540676776568606776445269901301489322659897550488216469545962330114439456450327105059143649149353691079858592284770257701514586653646227195894784337109820380725586800308876093495956683418516943600791035812934123566552256657548637356721364170303321445203248318052221608876405613735014581429046863850524823249770110491990966393306602127113232121844805053714961598819340772918780886767784492268026813617212138552880462432011890814832763157455453480244036737608502560568155935219962881254333016283106875208347859959837111605303362360686735617010806770356094119954850985971972173740157108951943158883889960769946088667172184453775159400416773426172185163544642073750820294724241000627118693340037228670955466887445979840508258034553074952786212905447793469416533745102450184312083150984276502843520142547725242420036764321913285201883578643256190127554977259428506738294094650002069424857941569933035773787408238363817558217731402200556355696264590285397096711343409176606399534486123848595737134078956097986897096403649443476180550440132129400660464020005964076985400565370669775001649507962489129968487179363143071990260056227184635557041873959503901703298160676708502034434721702736070337981820498702504612901752836363232547753133669634446212182280948830953449212093385245517672040199624163548955856440570085192091029300807379142100375091750164679249845932033295269830354534768690800943839523328879827294000968558885672349163214396311447169008056222766769723543731024881704573771049624407760697964694003855586008947448896853302136740492580514407729393955580489556711216778774585452721013198637847641603652665922709995374673905262003097098600295826073933596848127168932490801916573177100850314408973588759057608837176008255586173863863537610028088874109464298579173372270668553679213878959830281291941911631089480845893613059432816382467144386202929877438879934617765326964968950596805834503736177373180382300936221015689972069912183414349395106461498087096364312945860028806254674550241272982076023238962557223250366082054549672629899727845047788394343198743530974427374512431803960928917102896898594417389828136739556194292853212418189536177705143393509263700826967109944180530974835980527534343480734009517814874712043293597520502202457633238136380535255784193531700632068258618605704958229398173812474607952266968605468760232899150087704008769431156359521180518564669448293014075023298039436222182782240272844516787977851494198359872264106492071289241977002542132163865420492710010704534742706160402634260047073399438055207291585195236991244449614045909106967144147839858684971576230223513645334982033408
16

如果您需要精确的大数,最好的方法是使用non-standard libraries中的BigInteger,因为C ++标准库不支持它。