PAT 1016
正整数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
#include<stdio.h> //有错误的代码
int main(void)
{
char number_a[20]; //此处,为了方便对一个较长的数字分解成为一个个的单个数字,除了采用gets()+char num[]+(char-'0'===int)外,还可以使用while(number!=0){num[++i]=number%10; number=number/10;}的方法来对number中的数字进行枚举。
char number_b[20];
int DA,DB;
long long PA,PB;//此处,一开始认为10^10小于int的最大值(2^31-1),但是后来发现,10^10大于int的最大值,所以对于10^10不可以用int,应该用long long数据型;
long long sum=0;
int i;
gets(number_a); //此程序的输入部分有问题,因为题目输入的四个数值之间是将空格作为间隔,可以用scanf("%d %d %d %d", &-,&-,&-,&- )的形式,但是从编译的结果来看,显然用这段程序中的gets方法是不可以正确对应于题中的输入方法的(gets()输入法将'\n'也就是回车键当做输入的结束,并没有说可以将' '(空格)作为输入的结束,所以到现在的练习经历,还没有找到使用gets()来对应于A B C D格式输入的方法
scanf("%d",&DA); //
gets(number_b); //
scanf("%d",&DB); //
for(i=0;i<20;++i)
{
if(number_a[i]-'0'==DA)
sum=sum*10+DA;
}
PA=sum;
for(i=0,sum=0;i<20;++i)
{
if(number_b[i]-'0'==DB) //此程序的核心部分没问题
sum=sum*10+DB;
}
PB=sum;
printf("%lld",PA+PB);
}
//以下为本题的解
#include<stdio.h>
int main(void)
{
long long A,B,PA=0,PB=0;
int DA,DB;
scanf("%lld %d %lld %d",&A,&DA,&B,&DB);
while(A!=0) //这个while循环用于枚举(将一个整个数字拆解为一个一个的单个的数字的固定方法
{
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);
}