使用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

13 回复

我们的问题已经解决

更多关于使用Golang实现水仙花数时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢 😊

没有这样的规则;这不是真的。

result +=result**power

我们需要这样写吗?

请不要为显而易见的作业提供解决方案,那样没人能学到东西。

谢谢,但能否请你告诉我们具体在哪里硬编码了呢,拜托……

ashishsme14:

result += remainder*remainder*remainder

这一行。

看看这个解决方案,这是你想要的吗?:

https://play.golang.org/p/L5mjCnWeyay

你的计算仅适用于三位数的输入,因为你将每个数字都硬编码为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 ✓
回到顶部