【OJ】大數減法(使用棧的簡單例子)

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

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