甲想好了一个 n 位数字让乙来猜,只要猜的数字位数正确,至多有 1 位与谜底不同,且不同的数字相差不超过 1,就算猜对了。例如谜底是 67,若乙猜 66、68、77、57,就都算对了;猜 167 就不能算对。
输入格式:
输入首先在第一行给出一个不超过 1000 位数的、最高位不是 0 的正整数,是甲给出的谜底。随后若干行,每行给出一个乙猜的数字,都是最高位不是 0 的正整数。直到出现 -1 表示输入结束,这个数字不要做任何处理。题目保证乙至少猜了一次。
输出格式:
对每一个乙猜的数字,如果猜对了就输出 Yes,否则输出 No。
输入样例:
12345678909876
2345678909876
12345678900876
12345678809876
12345678909888
1234567890987
-1
输出样例:
No
No
Yes
No
No
思路:
题意都能看懂,就是甲输入一个字符串,然后乙输入字符串与甲比对(遇到-1后输入结束),如果乙输入的字符串与甲输入的相同或者乙输入的字符串中有一位与甲不同并且不同的这一位差值不能大于1,那么就说明乙猜对了,输出Yes,其他情况输出No,代码如下。
代码:
代码1:
#include<stdio.h>
#include<string.h>
char a[10010],b[10010];
int main()
{
scanf("%s",a);
while(1)
{
int s=0,flag=0,i,x,y;
getchar();
scanf("%s",b);
if(b[0]=='-')
break;
int l1=strlen(a),l2=strlen(b);
if(l1!=l2)
printf("No\n");
else
{
for(i=0;i<l1;i++)
{
if(a[i]!=b[i])
{
s++;
x=a[i]-'0';
y=b[i]-'0';
if(x-y<-1||x-y>1)
flag=1;
if(s>1)
flag=1;
}
if(flag)
break;
}
if(flag)
printf("No\n");
else
printf("Yes\n");
}
}
return 0;
}
代码2:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char a[10000],b[10000];
int main()
{
scanf("%s",a);
int l=strlen(a);
while(1)
{
scanf("%s",b);
if(b[0]=='-'&&b[1]=='1')
break;
int l1=strlen(b);
int i,k=0,flag=0,s;
if(l1!=l)
printf("No\n");
else
{
for(i=0; i<l; i++)
{
if(b[i]==a[i])
k++;
else
{
s=abs(a[i]-b[i]);
if(s<=1)
flag=1;
}
}
if(k==l)
printf("Yes\n");
else if(k==l-1&&flag==1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}