1. 程式人生 > >PAT乙級 部分A+B(三種處理方式)

PAT乙級 部分A+B(三種處理方式)

部分A+B (15 分)

題目描述:

正整數 A 的“D​A​​(為 1 位整數)部分”定義為由 A 中所有 D​A​​ 組成的新整數 P​A​​。例如:給定 A=3862767,D​A​​=6,則 A 的“6 部分”P​A​​ 是 66,因為 A 中有 2 個 6。

現給定 A、D​A​​、B、D​B​​,請編寫程式計算 P​A​​+P​B​​。

輸入格式:

輸入在一行中依次給出 A、D​A​​、B、D​B​​,中間以空格分隔,其中 0<A,B<10​10​​。

輸出格式:

在一行中輸出 P​A​​+P​B​​ 的值。

輸入樣例 1:

3862767 6 13530293 3

輸出樣例 1:

399

輸入樣例 2:

3862767 1 13530293 8

輸出樣例 2:

0

解法一思路&AC程式碼: 

Python大法好啊,倆行程式碼AC。第一行程式碼不需要解釋,第二行程式碼可以分解成三個步驟來理解:①呼叫字串中的count函式得到字串A中子字元Da的數量,用這個數量乘以字元Da,就可以得到題目中的Pa;②同理,呼叫字串中的count函式得到字串B中子字元Db的數量,用這個數量乘以字元Db,就可以得到題目中的Pb;③把Pa和Pb強制轉換成int型再相加就能得到最後的結果。

A,Da,B,Db = input().split()
print(int(A.count(Da)*Da or "0") + int(B.count(Db)*Db or "0"))

解法二思路&AC程式碼:

這是我用C++求解的第一種思路,跟Python的思路大致相同。這裡解釋一下string型強制轉換成int型的程式碼,atoi(Pa.c_str())。由於函式原型是int atoi(const char *nptr),所以在呼叫的過程中應該先用c_str()把string型轉換成char*的字串,再通過atoi來轉換成int型。

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

int main()
{
    string A,B;
    char Da,Db;
    cin >> A >> Da >> B >> Db;
    string Pa="",Pb="";
    for(int i=0;i<A.length();i++)
    {
        if(A[i] == Da)
        {
            Pa += Da;
        }
    }
    for(int i=0;i<B.length();i++)
    {
        if(B[i] == Db)
        {
            Pb += Db;
        }
    }
    int sum = atoi(Pa.c_str()) + atoi(Pb.c_str());  //string型強制轉換成int型再相加
    cout << sum << endl;
    return 0;
}

解法三思路&AC程式碼: 

其實這三種解法思路都差不多,就是細節處理有區別。這段程式碼中Pa和Pb都是int型,無需像前倆種解法一樣進行string型到int型的強制轉換,直接在遍歷字串的同時完成Pa和Pb的累加。

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

int main()
{
    string A,B;
    char Da,Db;
    cin >> A >> Da >> B >> Db;
    int Pa = 0,Pb = 0;
    for(int i=0;i<A.length();i++)
    {
        if(A[i] == Da)
        {
            Pa = Pa*10 + (Da-'0');
        }
    }
    for(int i=0;i<B.length();i++)
    {
        if(B[i] == Db)
        {
            Pb = Pb*10 + (Db-'0');
        }
    }
    int sum = Pa + Pb;
    cout << sum << endl;
    return 0;
}