我将字符串中的字母转换为相应的数字,如果结果可以被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"
答案 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"