PAT-B1016. 部分A+B 题解

题目描述

正整数 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

1.1. 思路

  • 法一:通过建立散列表,统计A,B中每个数字的个数,再根据DA,DB筛选出来,转换成十进制数相加,即可完成。
  • 法二:通过long long保存A,B,计算PA,PB时,根据DA,DB枚举A,B,进行计算PA,PB。

1.2. 注意点

  1. 注意strlen(str)的返回值为unsigned类型的,可以使用(int)进行强制转换;
  2. 散列表(哈希表)是一个计数(标记)的好办法;
  3. long long类型需要使用%lld

1.3. 代码

法一

#include <cstdio>
#include <cstring>

char numA[10];
char numB[10];

int main() {
    
    char A[10], B[10];
    int DA, DB;
    scanf("%s%d%s%d", A, &DA, B, &DB);
    for (int i=0; i < (int)strlen(A); i++) {
        numA[A[i] - '0']++;
    }
    for (int i=0; i < (int)strlen(B); i++) {
        numB[B[i] - '0']++;
    }
    
    int PA = 0, PB = 0;
    while (numA[DA]--) {
        PA = DA + PA * 10;
    }
    while (numB[DB]--) {
        PB = DB + PB * 10;
    }
    
    printf("%d", PA + PB);
    
    
    return 0;
}

法二

#include <cstdio>

int main() {
    
    long long A, B;
    int DA, DB;
    scanf("%lld%d%lld%d", &A, &DA, &B, &DB);
    
    int PA = 0, PB = 0;
    while (A > 0) {  // 枚举A的每一位
        if (A % 10 == DA) { 
            PA = DA + PA * 10;
        }
        A /= 10;
    }
    while (B > 0) {
        if (B % 10 == DB) {
            PB = DB + PB * 10;
        }
        B /= 10;
    }
    
    printf("%d", PA + PB);
    
    
    return 0;
}
上一篇:【题解】[ZJOI2019]语言


下一篇:最大期望算法(EM)