通過例子進階學習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
  • 循環的嵌套


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM