1. 程式人生 > >PAT1016部分A+B

PAT1016部分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; }