簡單幾步搞定高精度加法

高精度加法

題目描述

給定兩個正整數,計算它們的和

共兩行,每行包含一個整數

輸出一行,包含所求的和

數據長度1<=N<=10000001<=N<=1000000

問題分析

本題數據量龐大,數據長度有100W的長度,因此得將數使用字符串來存,將數字拆開後倒序存儲,這樣有效解決進位而要改變數組長度的問題,因此這樣處理方法簡單

將兩個數進行逐位相加,判斷進位則採用一個標識t來判斷,所加和爲n1+n2+tn_1+n_2+t

代碼實現

#include<bits/stdc++.h>
using namespace std;

vector<int> add(vector<int> &A, vector<int> &B){
	// 定義新的容器用來存儲 A + B 
	vector<int> C;
	// 定義進位,初始爲 0; 
	int t = 0; 
	// 循環累加 A 與 B 的各個位的數
	for(int i = 0; i < A.size() || i < B.size(); i++ ) 
	{
		// 分別判斷 A 與 B 是否還有數 
		if(i < A.size())	t += A[i];
		if(i < B.size())	t += B[i];
		// 將其個位數添加 
		C.push_back(t % 10);
		// 判斷 t 是否進位,若進位則修改爲 1
		t /= 10; 
	}
	// 判斷最後是否進位
	if(t) C.push_back(1);
	return C; 
}

int main(){
	string a, b;
	vector<int> A, B, C;
	
	cin >> a >> b; 
	// 倒序逐個拆分數字放入 <vector> 中
	for(int i = a.size() - 1; i >= 0; i--)	A.push_back(a[i] - '0');
	for(int i = b.size() - 1; i >= 0; i--)	B.push_back(b[i] - '0');
	C = add(A, B);
	//	倒置輸出,因爲裝入時倒序裝入 
	for(int i = C.size() - 1; i >= 0; i--)	printf("%d" ,C[i]);
	return 0;
} 

運行結果

輸入

154540
2544111

輸出

2698651

總結

對於大整數用字符串進行存放,拆分後的每一個數字用vector存放,從後開始往前存解決進位數字長度變化問題

循環次數取決於兩個數的長度

每次動態通過t /= 10判斷是否有進位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章