B1016刷题
很好,再次格局小了,有被气到。
原思路:先把数字从后往前模出个位数来,再依次和要查找的数字比对,关键来了,比对完之后要加一位数嘛,我走了两条歪路:
第一条:得出一次相等就把计数的count加一,同时用一个数组p[count]存放,害,后面出现需要把这个数组里的数组成一个数字再和另一个数字相加时,机智的我发现——我走歪了,回头一想:
第二条路:还是用count计数,PA在它原有的基础上,再加上DA*10^count次方,非常行得通,还让我重学了逻辑运算符,这个小尖号是异或的意思,于是我弄了个for循环得次方……(逐渐把路走窄了)好在后面没啥问题,直到——PAT告诉我部分错误,家人们,我试了查数据类型定义的问题等都没用,先不管了……看大佬的思路是最愉快的:压根不用管什么次方呀,数组呀,只需要把PA乘10再把DA加到各位上就行了,哭了……,好简单,好生气,为啥我想不到,这就是我数学不好的原因嘛。
这是原题:
1016 部分A+B (15 分)
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA是 66,因为 A 中有 2 个 6。现给定 A、DA 、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、D
A、B、DB,中间以空格分隔,其中 0<A,B<10^9。输出格式:
在一行中输出 PA+PB的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
然后,放放我第二条部分正确的代码和大佬的代码吧
It’s mine
#include <bits/stdc++.h>
using namespace std;
int main(){
unsigned long A;
long long int B;
int DA,DB/*PA[10],PB[10]*/;
long long int PA=0,PB=0;
int i=1,j=1,C=0,D;//C、D用于分离A和B暂存位置
long long int dex;
cin>>A>>DA>>B>>DB;
while(A>=10)
{
C=A%10;
A=A/10;
if(C==DA)
{
dex=1;
for(int m=1;m<i;m++)
{
dex=dex*10;
}
PA=PA+DA*dex;
i++;
}
}
while(B>=10)
{
D=B%10;
B=B/10;
if(D==DB)
{
dex=1;
for(int n=1;n<j;n++)
{
dex=dex*10;
}
PB=PB+DB*dex;
j++;
}
}
// int lens=strlens(a);
// for(int i=0;i<lens;i++)
//
cout<<PA+PB<<endl;
return 0;
}
这是大佬的:
#include<cstdio>
int main(){
long long A,B,DA,DB,x,y;
x=0;
y=0;
scanf("%lld %lld %lld %lld",&A,&DA,&B,&DB);
while(A!=0){ //枚举A的每一位
if(A%10==DA){
x=x*10+DA; //x=不是x+=
}
A/=10;
}
while(B!=0){
if(B%10==DB){
y=y*10+DB;
}
B/=10;
}
printf("%lld",x+y);
return 0;
}
言简意赅是不是,好了我退下了……
原大佬文章链接