字符串解码器工作不正常



我将字符串中的字母转换为相应的数字,如果结果可被6或NO整除,则打印YES。例如,ab为12,将给出YES。该程序对小字符串运行良好,但对很长的输入给出了错误的答案。我试图将integers的数据类型更改为long,但没有任何更改。

它不起作用的测试用例:这里#1

编辑:输入限制只允许小写字符"a"到"i"原始问题链接:https://www.hackerearth.com/problem/algorithm/encoded-strings-3/

str = raw_input()
n = len(str)
value = 0L
str = str[::-1]
for i in arange(n):
value = value*1L + (10L**i)*(ord(str[i])-96)
if value%6 == 0:
print "YES"
else:
print "NO"

如果输入没有任何额外字符(如空白、CR、制表符等),您的代码似乎可以像"测试数字是否可被6整除"中那样工作。您提供的URL不起作用,所以我看不到失败的测试。

代码中的两个主要错误:

1) 你在减去96——为什么?如果ord('0')等于48。如果你想找到str的真整数值,你应该减去48。由于96和48的差本身可以被6整除,这个错误仍然不能打破"可被6整整除"的测试,但我也看不出有任何好处。

2) 您的代码应该忽略非数字字符,否则这些字符将使转换偏离正轨。例如,一个简单的空白将在最终值上加-64,该值不能被6整除,这将破坏测试。

我建议您只需使用int(str)将字符串转换为int(对于非常长的数字,会自动生成长整数),并捕获无效str的ValueError异常。

dic = {}
for i in xrange(97,123):
dic[chr(i)] = str(i-96)
str = raw_input()
new_str = ""
for i in xrange(len(str)):
new_str += dic[str[i]]
val = 0
for i in xrange(len(new_str)):
val = ( (val*10)%6 + ((int(new_str[i]))%6) )%6 # without modular arithmetic val will turn to long data type
print "NO" if val else "YES"

使用长数据类型并对其应用操作需要时间。因此,首先解码原始字符串,并将整数形式存储在字符串数据类型中。然后应用基本的模运算,即(a+b)%m=(a%m+b%m)%m。

代码的问题似乎是长int可能不够长,无法容纳给定解码的字符串的整数值。

因此,这个问题可以通过应用可分性的数学规则来简化。

检查字符串最后一个字母的对应数字是否为偶数。如果未打印"否"并退出。

然后使用sum可分性属性检查3的可分性。

这是代码。

#Title: String decoding and divisibility by 6
#Author: Rtg
#Date: 29-05-16
str = raw_input()
n = len(str)
if (ord(str[n-1])-96)%2:
print "NO"
raise SystemExit
value = 0
for i in xrange(n):
value = value + ord(str[i])-96
if value%3 == 0:
print "YES"
else:
print "NO"

最新更新