C语言 PAT B1016 部分A+B mw的解题思路与优化方案

也是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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值