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

时间:2016-05-30 16:34:29

标签: python python-2.7 encoding decoding modulus

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

不适用的测试用例:here#1

编辑:输入限制只允许使用小写字符' a'到了'我' 原始问题链接: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"

3 个答案:

答案 0 :(得分:1)

如果输入没有任何额外的字符,如空格,CR,制表符等,您的代码似乎就像“正确测试一个数字是否可以被6整除”一样工作。您提供的URL不起作用,所以我可以没有看到失败的测试。

代码中的两个主要错误:

1)你减去96 - 为什么?如果ord('0')等于48.如果你想找到str的真正整数值,你应该减去48.由于96和48的差值本身可以被6整除,这个错误仍然没有打破“可以被6“整除,但我看不出任何优势。

2)你的代码应该忽略非数字字符,否则这些字符将抛出转换离场。例如,一个简单的空格会将-64添加到最终值,该值不能被6整除,并且会破坏测试。

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

答案 1 :(得分:0)

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。

答案 2 :(得分:-1)

代码的问题似乎是long int可能不足以保存字符串的整数值,解码为给定。

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

检查字符串最后一个字母的相应数字是否为偶数。如果没有打印'否'并退出。

然后使用sum divisibility属性检查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"