在Ruby中计算埃数的问题
埃数示例:153<代码>1**3+5**3+3**3=153在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
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的原始版本的结果是有价值的,然后是一个更干净的实现