1536: 大數減法
題目描述
求兩個不超過200位的非負整數的差。
輸入
有兩行,每行是一個不超過200位的非負整數,沒有多餘的前導0。
輸出
一行,即相減後的結果。結果裏不能有多餘的前導0,即如果結果是342,那麼就不能輸出爲0342。
樣例輸入
88888888888888888888
33333333333333333333
樣例輸出
55555555555555555555
解題代碼
大數運算也同樣是單純地運算,小學的時候學過那種運算。
因爲每次進行減法操作其實都只是對最後一位進行的(已經生成結果的不算最後一位的話),並且輸入輸出都非常符合棧的特點(先進後出)。
比如說輸入 123456
減去 5648
,首先進行的應該是最後一位,也就是 6
減去 8
。如果以棧來存儲的話,輸入的是123456,則棧top就是6,同樣另外一個棧就是8。
所以減法操作在這裏就是最後一個進入容器的數字進行的減法,所以可以考慮使用棧
。
另外需要考慮爲負數這個問題,等等。
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
/**
* 獲得某個字符串的長度
*/
int length(char str[])
{
int i=0;
while(str[i]!='\0') i++;
return i;
}
/**
* 比較兩個字符串對應的整數,誰大
* 因爲是大數,所以不能使用已經提供的函數
*/
int bigger(char str1[],char str2[])
{
int length1 = length(str1);
int length2 = length(str2);
if(length1!=length2) return length1>length2;
int i;
for(i=0; i<length1; i++)
{
if(str1[i]!=str2[i]) {
return str1[i] > str2[i];
}
}
return -1;
}
// written by Smileyan 多謝關注
int main()
{
char str1[250],str2[250];
stack<int> stack1,stack2,stack3;
int i;
cin>>str1>>str2;
// 用來記錄最終結果是不是負數
bool neg = false;
if(bigger(str1,str2) == false)
{
neg = true;
char temp[250];
strcpy(temp,str1);
strcpy(str1,str2);
strcpy(str2,temp);
}
// 入棧
for(i=0; str1[i]!='\0'; i++)
{
stack1.push(str1[i]-'0');
}
for(i=0; str2[i]!='\0'; i++)
{
stack2.push(str2[i]-'0');
}
int result;
// 如果是負數,則爲1
bool flag=false;
while(stack1.empty()==false&&stack2.empty()==false)
{
int num1 = stack1.top()-flag;
stack1.pop();
int num2 = stack2.top();
stack2.pop();
result = num1-num2;
flag = result<0;
// 如果這一位進行減法爲負數,需要往上借一位
if(flag) {
result += 10;
}
stack3.push(result);
}
if(neg == true) cout<<"-";
while(stack3.empty()==false)
{
int num=stack3.top();
stack3.pop();
cout<<num;
}
cout<<endl;
return 0;
}
總結
並不難,如果回想一下小學學過的,列兩個數然後進行減法操作的過程的話。
Smileyan
2019年9月19日 21:21