Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中计算埃数的问题_Ruby_If Statement_While Loop_Numbers - Fatal编程技术网

在Ruby中计算埃数的问题

在Ruby中计算埃数的问题,ruby,if-statement,while-loop,numbers,Ruby,If Statement,While Loop,Numbers,埃数示例:1531**3+5**3+3**3=153 puts "Enter a number: " number = gets.chomp.to_i initial_number = number angstrom = 0 while (number % 10) != 0 number = number % 10 angstrom = angstrom + (number ** 3) number = number / 10 end puts angstrom put

埃数示例:153<代码>1**3+5**3+3**3=153

puts "Enter a number: "
number = gets.chomp.to_i
initial_number = number
angstrom = 0
while (number % 10) != 0
    number = number % 10
    angstrom = angstrom + (number ** 3)
    number = number / 10
end

puts angstrom
puts initial_number

if angstrom == initial_number
    puts "YES ANGSTROM"
else
    puts "NO ANGSTROM"
end
例:输入是123

输入while,在数字%10语句后得到12。但是,在那之后,它不会再进入while;为什么呢<代码>12%10不应显示为
0


我添加了
put angstrom
put initial_number
行,只是为了检查这些数字发生了什么。

我在前面的评论中暗示了这一点,但你在
状态下破坏了你的
。您希望从数字中提取一个数字,但在此过程中,此行会将其删除:

number = number % 10
这保证了
number
将始终小于10,并将始终强制循环提前退出。你也会计算出完全错误的东西

最简单的解决方案是创建一个新变量,该变量表示您提取的数字

digit = number % 10
angstrom = angstrom + (digit ** 3)

进行此更改将允许您的
153
测试用例成功通过。

我在前面的评论中暗示了这一点,但您在
条件下破坏了
。您希望从数字中提取一个数字,但在此过程中,此行会将其删除:

number = number % 10
这保证了
number
将始终小于10,并将始终强制循环提前退出。你也会计算出完全错误的东西

最简单的解决方案是创建一个新变量,该变量表示您提取的数字

digit = number % 10
angstrom = angstrom + (digit ** 3)

进行这些更改可以使您的
153
测试用例成功通过。

我想您可能还需要以下内容:

angstrom = 0
while number > 0
  digit = number % 10
  angstrom += digit ** 3
  number /= 10
end
在不破坏数字的情况下隔离每个数字,并避免因输入数字内部包含的零而提前终止

补遗 通过使用
divmod
,这一点得到了进一步改进(由Cary Swoveland提供):

angstrom = 0
while number > 0
  number, digit = number.divmod(10)
  angstrom += digit ** 3
end

我想你还需要更多的东西:

angstrom = 0
while number > 0
  digit = number % 10
  angstrom += digit ** 3
  number /= 10
end
在不破坏数字的情况下隔离每个数字,并避免因输入数字内部包含的零而提前终止

补遗 通过使用
divmod
,这一点得到了进一步改进(由Cary Swoveland提供):

angstrom = 0
while number > 0
  number, digit = number.divmod(10)
  angstrom += digit ** 3
end
还有一种方法

def angstromize(number)
  number.to_s.each_char.reduce(0) { |t,d| t+(d.to_i)**3 }
end

angstromize(153)
  #=> 153
还有一种方法

def angstromize(number)
  number.to_s.each_char.reduce(0) { |t,d| t+(d.to_i)**3 }
end

angstromize(153)
  #=> 153

你完全破坏了你的循环。当你得到<代码>数字< /代码>后,它保证为0,因为你从数字中取出的任何数字都保证小于10。快速选择可能会阻碍其他答案,并使那些仍在研究答案的人短路。(我写的时候贴出了另一个答案。)不用着急。这里的许多人至少要等几个小时才能做出选择。你完全破坏了你的循环。当你得到<代码>数字< /代码>后,它保证为0,因为你从数字中取出的任何数字都保证小于10。快速选择可能会阻碍其他答案,并使那些仍在研究答案的人短路。(我写的时候贴出了另一个答案。)不用着急。这里的许多人在做出选择之前至少要等上几个小时。天哪,我不敢相信我没有注意到,我之前做了非常类似的事情,但我没有将数字保存到同一个“数字变量”中。我做了类似的事情:angstrom=angstrom+((数字%10)**3)天哪,我不敢相信我没有注意到,我之前做了非常类似的事情,但我没有将数字保存到同一个“数字变量”中。我做了类似的操作:angstrom=angstrom+((数字%10)**3)让我们不要忘记这个简便的方法。您可以将
digit=number%10
替换为
number,digit=number.divmod(10)
并删除
number/=10
。提醒您,如果将其放入方法中,我们需要
angstrom
作为最后一行。@CarySwoveland极好的建议!耶,鲁比!谢谢,你的方法效果最好,我的while条件不是对每个埃数都有效,因为数字中有内部零。pj,我讨厌看到那些加法。假装你在写一篇要发表的文章,就像我相信你经常做的那样。你仔细阅读了几份草稿,做出了你认为或其他人建议的修改。你不会保留你所拥有的,并说出你是如何改变它的;你只要改变它。如果你想感谢贡献者,你可以在某个地方的便条中这样做(这里是评论,就像你所做的那样)。“我希望在这里看到所有的答案都是这样的。”CarySwoveland这是一个观点可以不同的案例。我认为根据Allen M的原始版本显示结果是有价值的,然后根据您的反馈显示更干净的实现。另外,我喜欢在适当的时候给出属性(你是对的,我是一名学者),有时评论在这里是暂时的。让我们不要忘记这个方便的方法。您可以将
digit=number%10
替换为
number,digit=number.divmod(10)
并删除
number/=10
。提醒您,如果将其放入方法中,我们需要
angstrom
作为最后一行。@CarySwoveland极好的建议!耶,鲁比!谢谢,你的方法效果最好,我的while条件不是对每个埃数都有效,因为数字中有内部零。pj,我讨厌看到那些加法。假装你在写一篇要发表的文章,就像我相信你经常做的那样。你仔细阅读了几份草稿,做出了你认为或其他人建议的修改。你不会保留你所拥有的,并说出你是如何改变它的;你只要改变它。如果你想感谢贡献者,你可以在某个地方的便条中这样做(这里是评论,就像你所做的那样)。“我希望在这里看到所有的答案都是这样的。”CarySwoveland这是一个观点可以不同的案例。我认为展示一个基于Allen M的原始版本的结果是有价值的,然后是一个更干净的实现