前言

传送门

正文

题目描述

正整数 A 的“ D A D​_A DA(为 1 位整数)部分”定义为由 A 中所有 D A D​_A DA
​ 组成的新整数 P A P​_A​​ PA。例如:给定 A=3862767, D A D_A DA=6,则 A 的“6 部分” P A P_A PA 是 66,因为 A 中有 2 个 6。现给定 A、 D A D_A DA​​ 、B、 D B D_B DB ,请编写程序计算 P A P_A PA​​ + P B P_B PB​​ 。

输入格式:

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

输出格式:

在一行中输出 P A + P B P_A+P_B PA+PB 的值。

输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0

思路
  • 法一是通过字符串来处理的,循环遍历字符串中的每一位。
  • 法二直接枚举a的每一位,这时要注意题目中所给范围是 1 0 10 10^{10} 1010以内,因此需要使用long long 来存储a和b
参考题解
  • 法一
#include<cstdio>
#include<cstring>
#include<cmath>
 
int main(){
    char A[11],B[11];
    int a,b,P1=0,P2=0,len1,len2;
    scanf("%s%d%s%d",A,&a,B,&b);
    len1=strlen(A);
    len2=strlen(B);
    for(int i=0;i<len1;i++){
        if(A[i]-'0'==a){
            P1=P1*10+a; 
        }
    }
    for(int i=0;i<len2;i++){
        if(B[i]-'0'==b){
            P2=P2*10+b;
        }
    }
    printf("%d\n",P1+P2);
    return 0;
}
  • 法二
#include<cstdio>
int main(){
	long long a,b,da,db,pa=0,pb=0;
	scanf("%lld%lld%lld%lld",&a,&da,&b,&db);
	while(a!=0){
		if(a%10==da)pa=pa*10+da;
		a=a/10;
	}
	while(b!=0){
		if(b%10==db)pb=pb*10+db;
		b=b/10;
	}
	printf("%lld\n",pa+pb);
	return 0;
} 

后记

我寄愁心与明月