在Go(Golang)中检查一个数字是否是复数的方法

212 阅读2分钟

概述

例如,以下数字是复数

1
121
12321
9
0

下面的数字不是

-121
1211

我们有两种方法可以找出一个数字是否是复数

  • 把数字倒过来。如果反转后的数字等于原来的数字,那么这个数字就是回文。

  • 另一种方法是使用递归,并传入数字的指针。在向下移动递归树时,将该数字除以10。当向上移动递归树时,将数字指针上的值除以10。在递归树的任何一步中,当它们相遇时,原始数字的最后一位将是第一位,而指针上的数字的最后一位将是第一位。我们可以比较这两个数字来检查它们是否相等。这种检查是在它们每次相遇时进行的。

第一种解决方案--倒转数字

下面是同样的程序

package main

import (
	"fmt"
	"math"
)

func main() {
	output := isPalindrome(121)
	fmt.Println(output)

	output = isPalindrome(12)
	fmt.Println(output)

	output = isPalindrome(1234)
	fmt.Println(output)

	output = isPalindrome(12321)
	fmt.Println(output)

	output = isPalindrome(-101)
	fmt.Println(output)

}

func isPalindrome(x int) bool {

	if x < 0 {
		return false
	}
	if x < 10 {
		return true
	}
	xReversed := reverse(x)

	return xReversed == x
}

func reverse(x int) int {
	sign := "positive"
	if x >= 0 {
		sign = "positive"
	} else {
		sign = "negative"
	}

	x = int(math.Abs(float64(x)))

	var reversedDigit int

	for x > 0 {
		lastDigit := x % 10
		reversedDigit = reversedDigit*10 + lastDigit

		x = x / 10
	}

	if sign == "negative" {
		reversedDigit = reversedDigit * -1
	}

	return reversedDigit
}

输出

true
false
false
true
false

第二种解决方案--使用递归法

以下是相同的程序

package main

import "fmt"

func main() {
	a := 121
	output := isPalindrome(a, &a)
	fmt.Println(output)

	a = 12
	output = isPalindrome(a, &a)
	fmt.Println(output)

	a = 1234
	output = isPalindrome(a, &a)
	fmt.Println(output)

	a = 12321
	output = isPalindrome(a, &a)
	fmt.Println(output)

	a = -121
	output = isPalindrome(-a, &a)
	fmt.Println(output)

}

func isPalindrome(x int, dup *int) bool {
	if x < 0 {
		return false
	}
	if x < 10 {
		return true
	}

	palin := isPalindrome(x/10, dup)

	*dup = *dup / 10
	lastDigit := x % 10

	if palin && *dup%10 == lastDigit {
		return true
	}

	return false

}

输出

true
false
false
true
false