1. 程式人生 > 其它 >【noi】1.6_11大整數減法

【noi】1.6_11大整數減法

技術標籤:高精度字串

[noi]1.6_11大整數減法

總時間限制: 1000ms 記憶體限制: 65536kB
描述
求兩個大的正整數相減的差。

輸入
共2行,第1行是被減數a,第2行是減數b(a > b)。每個大整數不超過200位,不會有多餘的前導零。
輸出
一行,即所求的差。

樣例輸入
9999999999999999999999999999999999999
9999999999999
樣例輸出
9999999999999999999999990000000000000

#include<bits/stdc++.h>
using namespace std;
string stra,strb,strc;
int main(){ cin>>stra>>strb; while(stra.length()>strb.length()){ strb='0'+strb; } int jie=10; for(int i=stra.length()-1;i>=0;i--){ if(stra[i]<strb[i]){ stra[i]=char(stra[i]-'0'+jie+'0'); stra[i-1]=char(stra[i-1]-'0'-1+'0');//別忘記最後加'0 } strc=char(stra[i]-'0'-(strb[i]-'0'
)+'0')+strc; } //cout<<"strc="<<strc; int flag=0,flag1=0; for(int i=0;i<=strc.length()-1;i++){ if(strc[i]=='0' && flag1==0){ flag=1; }else{ flag=0; flag1=1; cout<<strc[i]; } } if(flag) cout<<"0"; return 0; }

總結:

一、還是用把兩個陣列補齊位數,從最後一位算起開始計算的方法

二、對於字串型別的資料做加減,要先轉換成ASCII計算,如果要把得到的結果再轉換成字元型的東西存入原先的字元陣列,要再加上’0’轉換成ASCII.下面一塊程式碼尤其要注意,剛一開始相減完未加’0’,結果輸出來奇怪的符號,把2020年的錯誤留到了2021年解決。

int jie=10;
	for(int i=stra.length()-1;i>=0;i--){
		if(stra[i]<strb[i]){
			stra[i]=char(stra[i]-'0'+jie+'0');
			stra[i-1]=char(stra[i-1]-'0'-1+'0');//別忘記最後加'0 
		}
		strc=char(stra[i]-'0'-(strb[i]-'0')+'0')+strc;
	}

1000-999,倒數第二位的0,第一位借位後,

stra[i-1]=char(stra[i-1]-'0'-1+'0');//別忘記最後加'0

‘0’-‘0’-1+'0’結果為:0-1+‘0’,-1+48=47,再經過轉換變為47對應的字元存入陣列,
在這裡插入圖片描述

i++,執行程式碼

stra[i]=char(stra[i]-'0'+jie+'0');

-1+10+‘0’,經轉換,剛好是’9’.