使用Golang实现水仙花数时遇到的问题
使用Golang实现水仙花数时遇到的问题 我们有一个使用Go语言实现水仙花数的任务,为此我们编写了如下代码:
package main
import "fmt"
func main() {
var number,tempNumber,remainder int
var result int =0
fmt.Scan(&number)
tempNumber = number
for {
remainder = tempNumber%10
result += remainder*remainder*remainder
tempNumber /= 10
if(tempNumber==0){
break
}
}
if(result==number){
fmt.Println("True")
}else{
fmt.Println("False")
}
}
我们无法获得期望的输出,错误标记如下(加粗部分):
153 正确 1634 错误 155 正确 2 错误 12456 正确 371 正确 8208 错误 92727 错误 1000 正确 548834 正确
更多关于使用Golang实现水仙花数时遇到的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢 😊
没有这样的规则;这不是真的。
result +=result**power
我们需要这样写吗?
请不要为显而易见的作业提供解决方案,那样没人能学到东西。
谢谢,但能否请你告诉我们具体在哪里硬编码了呢,拜托……
看看这个解决方案,这是你想要的吗?:
你的计算仅适用于三位数的输入,因为你将每个数字都硬编码为3次方。
你需要将其计算为 k 次方,其中 k 是数字的位数。你目前所有“正确”的结果都是偶然正确的,而不是通过正确的实现得到的。
我们尝试了以下方法,但问题依旧
var s int
var sum int
s = len(n)
for i:=0;i<len(n);i++ {
s=int(n[i]-'0')
sum += s*s*s
}
Go语言中没有幂运算符。只有math.Pow(),它接收float64类型参数并返回float64类型结果。
你需要自己实现一个基于整数的幂函数。这应该相对简单直接。
ashishsme14: 使用Go实现自恋数
我没有看到你在哪里计算自恋数。
package main
import "fmt"
func main() {
var n int
_, err := fmt.Scanln(&n)
if err != nil || n < 0 {
fmt.Println("False")
return
}
digits := 0
for m := n; m > 0; m /= 10 {
digits++
}
sum := 0
for m := n; m > 0; m /= 10 {
digit := m % 10
pow := 1
for i := 1; i <= digits; i++ {
pow *= digit
}
sum += pow
}
if sum == n {
fmt.Println("True")
} else {
fmt.Println("False")
}
}
你的代码只计算了三位数的立方和,但水仙花数(Narcissistic number)的定义是:一个n位数,其各位数字的n次方之和等于该数本身。对于1634(4位数),应该计算4次方,而不是3次方。
以下是修正后的代码:
package main
import (
"fmt"
"math"
)
func main() {
var number int
fmt.Scan(&number)
temp := number
digits := 0
// 计算位数
for temp > 0 {
digits++
temp /= 10
}
temp = number
result := 0
for temp > 0 {
remainder := temp % 10
result += int(math.Pow(float64(remainder), float64(digits)))
temp /= 10
}
if result == number {
fmt.Println("True")
} else {
fmt.Println("False")
}
}
或者使用更高效的整数幂计算:
package main
import "fmt"
func power(base, exp int) int {
result := 1
for i := 0; i < exp; i++ {
result *= base
}
return result
}
func main() {
var number int
fmt.Scan(&number)
temp := number
digits := 0
for temp > 0 {
digits++
temp /= 10
}
temp = number
result := 0
for temp > 0 {
remainder := temp % 10
result += power(remainder, digits)
temp /= 10
}
if result == number {
fmt.Println("True")
} else {
fmt.Println("False")
}
}
测试用例验证:
- 1634:1⁴ + 6⁴ + 3⁴ + 4⁴ = 1634 ✓
- 8208:8⁴ + 2⁴ + 0⁴ + 8⁴ = 8208 ✓
- 92727:9⁵ + 2⁵ + 7⁵ + 2⁵ + 7⁵ = 92727 ✓
- 2:2¹ = 2 ✓


