La mise en œuvre des nombres rotatifs

Nous appelons un nombre X un bon nombre, et si chacun de ses nombres pivote de 180 degrés un par un, nous pouvons toujours obtenir un nombre valide différent de X. Chaque nombre doit être tourné.

Un nombre est valide si chacun de ses chiffres reste un nombre après avoir été tourné.0, 1 et 8 sont toujours eux-mêmes lorsqu'ils sont tournés; 2 et 5 peuvent être tournés l'un dans l'autre (dans ce cas, ils tournent dans des directions différentes; dans d'autres les mots 2 et 5 sont des images miroir l'un de l'autre); la même chose avec 6 et 9, tout nombre autre que ceux-ci n'est plus un nombre valide après rotation.

Maintenant, nous avons un entier positif N, combien de nombres de 1 à N est X un bon nombre?

Exemple:
Entrée: 10
Sortie: 4
Explication:
Il y a quatre bons nombres dans [1, 10]: 2, 5, 6, 9.
Notez que 1 et 10 ne sont pas de bons nombres, car ils ne changent pas après la rotation.

Analyse de sujet
Ce problème peut être résolu récursivement. Lors de la résolution de ce problème, l'opération de recherche du reste est utilisée pour juger si le chiffre des unités remplit la condition de bon nombre, puis nous utilisons la division pour déterminer si la place des dizaines, la place des centaines ou la place des milliers est une bonne nombre.
Après n% 10, le programme détermine si le reste correspond au bon nombre et est valide. Renvoie false si n% 10 n'est pas valide et n'est pas un bon nombre.
Si le chiffre des unités est valide ou bon, le chiffre des dizaines est jugé, puis le chiffre des milliers est jugé, et ainsi de suite, jusqu'au chiffre le plus élevé. La fonction booléenne utilisée pour le marquage est affectée à True si les conditions valides sont remplies à partir de ceux-ci se placent au plus haut, et l'un d'eux est un bon nombre.

Code

package main

import (
	"fmt"
)

func main() {
	var N int
	var answer int
	fmt.Scan(&N)
	answer=rotatedDigits(N)
	fmt.Println("Input:",N," Output:",answer)
	}
func good(n int ,flag bool) bool {
	if n == 0 {
		return  flag
	}
	d := n % 10
	switch d {
	case 3,4,7:
		return  false
		// 3,4,7不为好数且无效
	case 0,1,8:
		return good(n/10,flag) //0,1,8有效但不为好数
	}
	//2,5,6,9 为好数
	return  good(n/10,true)
}

func rotatedDigits(N int) int {
	flag := false
	answer := 0
	for i := 1 ; i <= N; i++{
		if good(i,flag){
			answer++
		}
	}
	return answer
}

Résultat
Insérez la description de l'image ici

A publié 4 articles originaux · J'aime1 · Visites 91

Je suppose que tu aimes

Origine blog.csdn.net/qq_43337384/article/details/105633148
conseillé
Classement