题目描述:
正整数 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、DA 、B、DB,中间以空格分隔,其中 0<A,B<10^9。
输出格式:
在一行中输出 PA +PB的值。
输入样例1:
3862767 6 13530293 3
输出样例1:
399
输入样例2:
3862767 1 13530293 8
输出样例2:
0
题意
输入四个数A、DA、B、DB,其中DA跟DB都是单个数字。将A中的数字DA全都拼在一起得到PA,将B中的数字DB全都拼在一起得到PB,输出PA+PB。
样例解释
样例1: A=3862767,DA=6; B=13530293,DB=3; 这样6在A中出现了2次,因此PA=66;而3在B中出现了三次,因此PB=33. 最后输出66+333=399. 样例2: A=3862767,DA=1; B=13530293,DB=8。 这样1在A中出现了0次,因此PA=0;而8在B中出现了0次,因此PB=0. 最后输出0+0=0.
解题思路
令PA初值均为0,枚举A中的每一位,如果该位恰好等于DA,则令PA=PA*10+DA。这样当枚举完A中的每一位之后,就得到了PA。 同理可以得到PB。最后输出PA+PB即可。
注意点
①例如DA=6,而现在PA=66,如果当再次碰到A中新的6的时,PA=PA10+DA就是PA=6610+6=666,即给PA准备增加了一位6. ②由于题目中给出的范围是10^10以内,这个范围是超过int的,因此需要使用longlong来存放A和B。不过也可以用字符串来存储A和B,方法其实都是一样的。
代码
#include<cstdio>
int main()
{
long long a, b, da, db;
scanf("%lld %lld %lld %lld", &a, &da, &b, &db);
long long pa = 0, pb = 0;
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;
}
|