1. 程式人生 > >PAT乙級1016部分A+B

PAT乙級1016部分A+B

1016 部分A+B (15 分)
正整數 A 的“D​A(為 1 位整數)部分”定義為由 A 中所有 D​A組成的新整數 P​A 。例如:給定 A=3862767,DA=6,則 A 的“6 部分”P
​A是 66,因為 A 中有 2 個 6。現給定 A、D​A、B、D​B,請編寫程式計算PA+PB 。

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

輸出格式:
在一行中輸出 P​A+PB的值。

輸入樣例 1:
3862767 6 13530293 3
輸出樣例 1:
399
輸入樣例 2:
3862767 1 13530293 8
輸出樣例 2:
0

程式碼如下:

#include <iostream>
#include <map>
#include <cmath>
using namespace std;
int main()
{
    string a,b;
    int da,db;
    long double sum=0;
    cin>>a>>da>>b>>db;
    map<int,int> m;
    for(int i=0;i<a.size();i++){
        if((a[i]-'0')==da)
m[da]++; } for(int i=0;i<b.size();i++){ if((b[i]-'0')==db) m[db]++; } while(m[da]--){ sum+=da*pow(10,m[da]); } while(m[db]--){ sum+=db*pow(10,m[db]); } cout<<sum<<endl; return 0; }

這個題採用map容器第二個操作點始終操作超時.

這樣寫就沒有問題

#include <
iostream> #include <cmath> using namespace std; int main() { string a,b; int da,db,counta=0,countb=0; long int sum=0; cin>>a>>da>>b>>db; for(int i=0;i<a.size();i++){ if((a[i]-'0')==da) counta++; } for(int i=0;i<b.size();i++){ if((b[i]-'0')==db) countb++; } while(counta--){ sum+=da*pow(10,counta); } while(countb--){ sum+=db*pow(10,countb); } cout<<sum<<endl; return 0; }