字符串解码器无法正常工作

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.