在大型字符串的情况下,"sum"函数不能按预期工作



在Ruby中,#sum用于计算

  1. 数组的和
  2. 基于函数或条件的数组的和
  3. 字符串(非字符数组(中ASCII码点(ord(的总和,即'abcd'.sum # => 394

第三个问题是以下

对于下面的字符串,

AwotIJHOAIJSRoieJHOjasOIADaoiHAOHJAOIJGOIajdOIQWJTOIGJDOINCOIASORIOGIMAOIMEORIQEMOIGMEOIFMASKDJQOWJGOJOASJOIQWOGIMASOIDMOQWIROQIGJOIAMSFOAIJGIHIWUNVNZMXCNXCKJQOWRIEOGSDGSPOKSDLAMKMROQIJRDFLKMZXOIAJSQPIRKLMAdglkaSFAJOIAJFOIQWJEOIQJKAMCLKACMALKSDLAKWEQANLEIRJRQFIJAOIVAWOTIJHOAIJSROIEJHOJASOIADAOIHAOHJAOIJGOIAJDOIQWJTOIGJDOINCOIASORIOGIMAOIMEORIQEMOIGMASODLQWKEJOIFJLKMALSKQIOWELKMZLXKMFALSFJQOIWEAOISFWIDHGPSODRJAWOPIJHOIDJOIAJTGIOJAORAJWOIJHOFMAOIFMOIPDMOAIPWJTOPIJDOIFjawoiRJOIpjmaioGJIGHAIJRHQHQIUEIvnaksJDNWIORQIOPEGHIDVNAJKNASIPHRQEUITHIUHDNAJSNWIHJQIWJQEOIGOIDVNAKOSDNAOPWPJQOPIWTJQEOIPGDPJFNASPJNQWOIRQWIOTOIVNAKSFNAIOAWOTIJHOAIJSROIEJHOJASOIADAOIHAOHJAOIJGOIAJDOIQWJTOIGJDOINCOIASORIOGIMAOIMEORIQEMOIGMASODLQWKEJOIFJLKMALSKQIOWELKMZLXKMFALSFJQOIWEAOISFWIDHGPSODRJAWOPIJHOIDJoiajTGIOJAORAJWOIJHOFMAOIFMOIPDMOAIPWJTOPIJDOIFJAWOIRJOIPJMAIOGJIGHAIJRHQHQIUEIVNAKSJDNWIORQIOPEGHIDVIPNWIHJQIWJQEOIGOIDVNAKOSDNAOPWPJQOPIWTJqeoIPGDPJFNASPJNQWJQWOIRJgonasKFAWOEJQWOIJOGALKFNASLFKqeqOFIJAOISFJAOISFJAWOI

它很大,(1000个字符(,下面的程序不适用于

putc gets.upcase.sum/~/$/

它适用于所有其他较小尺寸的字符串。以上的输出必须是K。但显示9

但是如果我做这个

putc gets.upcase.chars.sum(&:ord)/~/$/

显示K。但是前一个为所有其他字符串提供了正确的输出,除了像这样的大字符串。

这里怎么了?

编辑:在线试用链接

在线试用!

字符串(非字符数组(中ASCII码点(ord(的总和,即"abcd"。Sum#=>394

实际上,我以前从未听说过String#sum,尽管我对这门语言相当熟悉。所以我查了一下:

返回str中字符的基本n位校验和,其中n是可选的Integer参数,默认为16。结果只是str2**n - 1中每个字节的二进制值的总和。这不是一个特别好的校验和。

当然,使用您的示例输入字符串,这就是为什么我们得到:

str.chars.map(&:ord).sum
# => 77090
str.sum
# => 11554

由于77090 > 2**15。此外,77090 % 2**15 == 11554

如果您对n使用较大的值,则(检查(和就是您所期望的:

str.sum(100)
#=> 77090

最新更新