2016-02-12 45 views
-1

我寫了一個簡單的程序是:如何使用pow()函數計算C++中超過2^32的功率?

#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()或通過任何其他手動方法。

+0

英特斯可以保持整數達到:2,147,483,647 –

+0

@DenisRadinski對於32位有符號整數,這是正確的。無符號32位整數可以保持最大值4,294,967,295。 –

+0

@DenisRadinski--無論是C還是C++標準都要求這樣做。 'int'只需要保存-32,767到32,767(即16位)的值,但是編譯器可以用更大的類型實現它們。 –

回答

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 longint可以通過聲明他們unsigned容納的最大價值。

+0

你也應該讓'count'成爲'long long'。 – PaulMcKenzie

+0

@PaulMcKenzie謝謝。隨時可以編輯。 –

+0

我不同意。 count只能達到幅度lg(n),可以存儲在int中。 – trincot