PAT乙级 1016 部分A+B (15 分) --两种方法

题目内容

正整数 A 的“DA​(为 1 位整数)部分”定义为由 A 中所有 DA​ 组成的新整数 PA​。例如:给定 A=3862767,DA​=6,则 A 的“6 部分”PA​ 是 66,因为 A 中有 2 个 6。

现给定 A、DA​、B、DB​,请编写程序计算 PA​+PB​。

输入格式:

输入在一行中依次给出 A、DA​、B、DB​,中间以空格分隔,其中 0<A,B<109。

输出格式:

在一行中输出 PA​+PB​ 的值。

输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0

解题思路

方法一 原始方法

传入字符串A,B 字符da,db,遍历字符串,统计字符出现的次数,定义一个新的函数传入da,db以及他们在字符串中出现的次数,将字符形转换为整形,然后通过pow函数累加起来,最后返回两个累加和之和。

方法二 利用c++ string新特性 来做

除了题目要求定义的四个数据外,再额外定义两个字符串A,B,push_back()存放字符,然后定义一个String转换为int的函数,解题思路与方法一相同。

详细代码

方法一

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int fun(char a,char b,int counta,int countb){
    int suma = 0,sumb = 0;
    int ka = a-'0';
    int kb = b-'0';
    for(int i = 0;i<counta;i++){
        suma+=pow(10,i)*ka;
    }
    for(int i = 0;i<countb;i++){
        sumb+=pow(10,i)*kb;
    }
    return suma+sumb;
}
int main(){
    string A,B;
    char da,db;
    int counta = 0,countb = 0;
    cin>>A>>da>>B>>db;
    for(int i = 0;i<A.length();i++){
        if(A[i]==da) counta++;
    }
    for(int i = 0;i<B.length();i++){
        if(B[i]==db) countb++;
    }
    cout<<fun(da,db,counta,countb);
}

方法二

#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;


int s2i(string s){
    stringstream ss;
    int k;
    ss<<s;
    ss>>k;
    return k;
}
int main(){
    cin.tie();
    string A,B,AA,BB;
    char a,b;
    cin>>A>>a>>B>>b;
    for(int i = 0;i<A.size();i++) {
        if(A[i] == a) AA.push_back(a);
    }
    for(int i = 0;i<B.size();i++) {
        if(B[i] == b) BB.push_back(b);
    }
    cout<<s2i(AA)+s2i(BB);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45660485/article/details/119295786