题目描述
甲想好了一个 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
程序代码
C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
string ans;
cin >> ans;
while(true)
{
string s;
cin >> s;
if(s == "-1") break; // -1 表示输入结束,不用处理
if(ans.size() != s.size()) // 猜的数字位数不对
{
puts("No");
continue;
}
int cnt = 0;
for(int i = 0; i < s.size(); i++)
{
if(ans[i] != s[i])
{
if(abs((ans[i] - '0') - (s[i] - '0')) > 1)
{
cnt = 999; // 不同的数字相差超过 1 时,把计数器置为一个较大的数
continue;
}
else
cnt++; // 有 1 位与谜底不同,计数器 +1
}
}
if(cnt > 1) // 满足"至多有 1 位与谜底不同,且不同的数字相差不超过 1"
puts("No");
else
puts("Yes");
}
return 0;
}
Python
a=input()
while True:
s=input()
if s=='-1': # -1 表示输入结束,不用处理
break
if len(s)!=len(a): # 猜的数字位数不对
print('No')
continue
cnt=0
for i in range(len(a)):
if a[i]!=s[i]:
if abs(int(a[i])-int(s[i]))>1:
cnt=999 # 不同的数字相差超过 1 时,把计数器置为一个较大的数
break
else:
cnt+=1 # 有 1 位与谜底不同,计数器 +1
if cnt>1: #满足"至多有 1 位与谜底不同,且不同的数字相差不超过 1"
print('No')
else:
print('Yes')