通過例子進階學習C++(四)計算2的64次方,不服寫寫看
阿新 • • 發佈:2020-01-15
本文是通過例子學習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.總結
通過該例子,可以學習:
- 進一步理解
int
,long
,每個型別的變數值是有範圍的; - 可以通過陣列,進行超大數字的
+ - * /
運算; - 陣列定義及使用;
- 字元和數字的轉換,從數字
0
轉換為字元'0'
,或者從字元'0'
轉換為數字0
; - 迴圈的巢狀