1. 程式人生 > >通過例子進階學習C++(四)計算2的64次方,不服寫寫看

通過例子進階學習C++(四)計算2的64次方,不服寫寫看

本文是通過例子學習C++的第四篇,通過這個例子可以快速入門c++相關的語法。

1.乍一看題目非常簡單,簡單思考一下,可以通過for迴圈實現:

#include <iostream>
using namespace std;
int main()
{
    int num = 1;
    for(int i=0;i<64;i++){
        num *= 2;
    }
    
    cout<<"2的64次方是"<<num;
    return 0;
}

然而,程式碼執行後,得到的結果是0,什麼?驚掉了下巴,居然不對?

程式執行後效果如下:

2.一番思考下來,應該是2的64次方超過int能表示的範圍了,溢位了就輸出0。

那麼用long long儲存怎麼樣呢?順便輸出2的1次方,直到2的64次方:

#include <iostream>
using namespace std;
int main()
{
    long long num = 1;
    for(int i=0;i<64;i++){
        num *= 2;
        cout<<"2的"<<i+1<<"次方是"<<":"<<num<<endl;
    }
    
    cout<<"2的64次方是"<<num;
    return 0;
}

程式執行後效果如下:

誰來拯救我,還是不對啊?

3.看來long long型別也無法解決溢位問題

回到問題本身,這是一個乘法計算,計算2的62次方得到 4611686018427387904,2的63次方,是這個數字乘以2已經溢位了。考慮一下,我們如何計算4611686018427387904*2=?

可以用字元陣列儲存這個數字,然後計算乘法就可以了。

#include<iostream>
using namespace std;

int main(){
    char n[32];
    int a,b,jin=0;
    
    //初始化陣列
    n[0] = '1';
    for(int i=1;i<32;i++){
        n[i] = '0';
    }
    
    //迴圈64次,每次陣列的值乘以2
    for(int j=0;j<64;j++){
        jin = 0;
        //從最低位開始,計算乘以2後各個位上的值:當前值 * 2 + 進位,然後轉換為字元
        for(int i=0;i<32;i++){
            a = (n[i]-'0') * 2;
            n[i] = a%10 + jin + '0';
            jin =  a/10;
        }
    }
    
    cout<<"2的64次方是:";
    for(int i=31;i>=0;i--){
        cout<<n[i];
    }
    
    return 0;
}

4.總結

通過該例子,可以學習:

  • 進一步理解intlong,每個型別的變數值是有範圍的;
  • 可以通過陣列,進行超大數字的+ - * /運算;
  • 陣列定義及使用;
  • 字元和數字的轉換,從數字0轉換為字元'0',或者從字元'0'轉換為數字0
  • 迴圈的巢狀