题目描述
正整数 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<1010。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 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. 注意点
- 注意
strlen(str)
的返回值为unsigned
类型的,可以使用(int)
进行强制转换; - 散列表(哈希表)是一个计数(标记)的好办法;
-
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;
}