首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby中Angstrom数的计算问题

Ruby中Angstrom数的计算问题
EN

Stack Overflow用户
提问于 2016-10-17 22:19:38
回答 3查看 47关注 0票数 0

Angstrom数示例: 153;1**3 + 5**3 + 3**3 = 153

代码语言:javascript
复制
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

输入we,则在number % 10语句之后得到12。但是,在那之后,它不会再次进入;为什么呢?12 % 10不应该出现在0上。

我添加了puts angstromputs initial_number行,只是为了检查数字是怎么回事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-17 22:45:49

我怀疑你想要更多的东西,比如:

代码语言:javascript
复制
angstrom = 0
while number > 0
  digit = number % 10
  angstrom += digit ** 3
  number /= 10
end

在不破坏数字的情况下隔离每个数字,并避免从内部包含在输入数字中的零提前终止。

增编

这是通过使用divmod进一步改进的(凯里斯沃夫兰提供的)

代码语言:javascript
复制
angstrom = 0
while number > 0
  number, digit = number.divmod(10)
  angstrom += digit ** 3
end
票数 2
EN

Stack Overflow用户

发布于 2016-10-17 22:59:44

这是另一种方法。

代码语言:javascript
复制
def angstromize(number)
  number.to_s.each_char.reduce(0) { |t,d| t+(d.to_i)**3 }
end

angstromize(153)
  #=> 153
票数 1
EN

Stack Overflow用户

发布于 2016-10-17 22:27:11

我在前面的评论中曾暗示过这一点,但您正在残害您的while条件。你想从数字中得到一个数字,但是在这个过程中,这一行会把它踩出来:

代码语言:javascript
复制
number = number % 10

这保证了number总是小于10,并且总是迫使你的循环提前退出。你也会计算出完全错误的东西。

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

代码语言:javascript
复制
digit = number % 10
angstrom = angstrom + (digit ** 3)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40096575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档