也是codeup上面题目编号6170的问题 H: 部分A+B
题目
正整数 A A A 的“ D A D_A DA(为1位整数)部分”定义为由 A A A中所有 D A D_A DA组成的新整数 P A P_A PA。例如:给定 A A A = 3862767, D A D_A DA = 6,则 A A A的“6部分” P A P_A PA是66,因为 A A A中有2个6。
现给定 A A A、 D A D_A DA、 B B B、 D B D_B DB,请编写程序计算 P A P_A PA + P B P_B PB。
输入
输入在一行中依次给出
A
A
A、
D
A
D_A
DA、
B
B
B、
D
B
D_B
DB,中间以空格分隔,其中0 <
A
,
B
A, B
A,B <
1
0
10
10^{10}
1010。
输出
在一行中输出
P
A
P_A
PA +
P
B
P_B
PB的值。
输入样例
3862767 6 13530293 3
3862767 1 13530293 8
输出样例
399
0
解题思路
首先要解决输入数的范围问题,题目要求说的很明确了,所以我们采用long long型整形变量。我的思路很简单,把输入的四个数存放在四个变量中,对A,B进行一位位的拆分存放到两个数组中,才遍历数组与对应的 D A D_A DA和 D B D_B DB进行比较,符合的数在存放到两个新的数组中。最后两个新的数组逆序乘10的n次方输出相加得出结果。
这种思路还是挺简单的希望能对你有所启发。
总体代码
#include<stdio.h>
#include<string.h>
#include<math.h>
char a[20],b[20];
long long int x,y;
int u,v,q,w;
int main(){
while(scanf("%lld%d%lld%d",&x,&u,&y,&v)!=EOF){
long long int p=0,t=0;
int c[20]={0},d[20]={0};
int j=0,k=0,e=0,f=0;
while(x!=0){
q=x%10;
if(q==u){
c[j]=u;
j++;
}
x=x/10;
}
while(y!=0){
w=y%10;
if(w==v){
d[k]=v;
k++;
}
y=y/10;
}
for(int i=j-1;i>=0;i--){
p+=c[i]*pow(10,e);
e++;
}
for(int i=k-1;i>=0;i--){
t+=d[i]*pow(10,f);
f++;
}
printf("%d\n",p+t);
}
return 0;
}