字符串解码器无法正常工作
String decoder not working properly
我正在将字符串中的字母转换为相应的数字,如果结果可以被 6 整除,则打印 YES 或 NO。例如,ab 是 12,将给出 YES。该程序对于小字符串工作正常,但对于非常长的输入给出错误的答案。我试图将整数的数据类型更改为 long 但没有任何改变。
它不起作用的测试用例:here#1
编辑:输入限制只允许小写字符 'a' 到 'i'
原题link: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、制表符等,您的代码似乎可以像 "tests correctly whether a number is divisible by 6" 一样工作。您提供的 URL 不工作,所以我可以没有看到失败的测试。
代码中的两个主要错误:
1) 您要减去 96 - 为什么?如果 ord('0') 等于 48。如果你想找到 str 的真正整数值,你应该减去 48。由于 96 和 48 的差本身可以被 6 整除,所以这个错误仍然没有打破 "divisible by 6" 测试,但我也没有看到任何优势。
2) 您的代码应忽略非数字字符,否则这些字符会使转换偏离正轨。例如,一个简单的空格会将 -64 添加到您的最终值,该值不能被 6 整除并且会破坏测试。
我建议您坚持使用 int(str) 将字符串转换为 int(对于非常长的数字会自动生成长整数),并捕获无效 str 的 ValueError 异常。
代码的问题似乎是 long int 可能不够长,无法保存按给定解码的字符串的整数值。
因此,可以通过应用可整除性的数学规则来简化问题。
检查字符串最后一个字母对应的数字是否为偶数。如果不打印'NO'并退出。
然后检查是否能被 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"
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.
我正在将字符串中的字母转换为相应的数字,如果结果可以被 6 整除,则打印 YES 或 NO。例如,ab 是 12,将给出 YES。该程序对于小字符串工作正常,但对于非常长的输入给出错误的答案。我试图将整数的数据类型更改为 long 但没有任何改变。
它不起作用的测试用例:here#1
编辑:输入限制只允许小写字符 'a' 到 'i' 原题link: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、制表符等,您的代码似乎可以像 "tests correctly whether a number is divisible by 6" 一样工作。您提供的 URL 不工作,所以我可以没有看到失败的测试。
代码中的两个主要错误:
1) 您要减去 96 - 为什么?如果 ord('0') 等于 48。如果你想找到 str 的真正整数值,你应该减去 48。由于 96 和 48 的差本身可以被 6 整除,所以这个错误仍然没有打破 "divisible by 6" 测试,但我也没有看到任何优势。
2) 您的代码应忽略非数字字符,否则这些字符会使转换偏离正轨。例如,一个简单的空格会将 -64 添加到您的最终值,该值不能被 6 整除并且会破坏测试。
我建议您坚持使用 int(str) 将字符串转换为 int(对于非常长的数字会自动生成长整数),并捕获无效 str 的 ValueError 异常。
代码的问题似乎是 long int 可能不够长,无法保存按给定解码的字符串的整数值。
因此,可以通过应用可整除性的数学规则来简化问题。
检查字符串最后一个字母对应的数字是否为偶数。如果不打印'NO'并退出。
然后检查是否能被 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"
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.