【每周一題】2017.3.2 HDU1002 解題報告

題目描述

解題分析

  • 這道題考察的是大數(shù)運算,要求實現(xiàn)兩個數(shù)字相加的過程,包括讀取每一位數(shù)字,實現(xiàn)低位向高位進位,最后打印輸出。其思路也非常簡單。給出一個最常見的解題思路:首先使用字符串讀入A和B,將A和B的每一位分解開并從按照低位到高位的順序存放在int數(shù)組里,然后用for循環(huán)來對每一位進行相加和進位,最后倒序輸出即可。

  • 幾個需要注意的地方:

    1. 題中說兩個數(shù)字不超過1000位,但相加后進位可能超過1000位,因此結(jié)果數(shù)組的長度要超過1001。
    2. 有多個輸入數(shù)據(jù),因此每次算完后要清空數(shù)組。
    3. 需要考慮到A和B的位數(shù)不一樣的情況。
    4. 不要忘記最高位也有可能進位。
    5. 注意格式,必須跟示例數(shù)據(jù)的輸出格式一模一樣。
  • 這次的題目相對簡單,主要是為了幫助大家熟悉OJ的用法,后續(xù)的題目會逐漸增加難度。大家可以購買算法書籍來自學(推薦《算法(第四版)》(ISBN: 9787115293800)以及《算法導論》)。另外,在解題過程中,需要你對時間和空間復雜度有非常熟悉的概念。

思考題

1. 這道題的時間復雜度和空間復雜度是多少?

2. 如何實現(xiàn)大數(shù)的減法、乘法和除法?請在腦海中大致形成主要代碼段。

例程(C++)

(注:例程只是給出一種解題方法,不是標準程序,也不一定是最完美的解法)

#include <iostream>
#include <string>
using namespace std;


void clearArray(short _array[], int _count)
{
    for (int i = 0; i < _count; i++)
    {
        _array[i] = 0;
    }
}

int main()
{
    int totalCase;
    string a, b;
    short numA[1000], numB[1000], numC[1001];

    cin >> totalCase;
    int countCase = totalCase;

    while (countCase--)
    {
        cin >> a >> b;
        
        //格式很重要,別忘記case之間有個空行
        if (countCase < totalCase - 1) 
            cout << endl;

        cout << "Case " << totalCase - countCase << ":" << endl;
        cout << a << " + " << b << " = ";
        
        //清空數(shù)組。是否有更快的方法?
        clearArray(numA, 1000);
        clearArray(numB, 1000);

        for (int i = 0; i < a.length(); i++)
            numA[i] = (short) (a[a.length() - i - 1] - 48);

        for (int i = 0; i < b.length(); i++)
            numB[i] = (short) (b[b.length() - i - 1] - 48);

        int finalSize = a.length() > b.length() ? a.length() : b.length();
        int carry = 0;
        for (int i = 0; i < finalSize; i++)
        {
            if (numA[i] + numB[i] + carry > 9)
            {
                numC[i] = numA[i] + numB[i] + carry - 10;
                carry = 1;
            }
            else
            {
                numC[i] = numA[i] + numB[i] + carry;
                carry = 0;
            }
        }

        //別忘了最高位還有進位
        if (carry != 0)
        {
            numC[finalSize] = carry;
            finalSize++;
        }

        //output 倒序輸出
        for (int i = finalSize - 1; i >= 0; i--)
        {
            cout << numC[i];
        }
        cout << endl;
    }

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容