数値Xを適切な数値と呼び、その数値を1つずつ180度回転しても、Xとは異なる有効な数値を取得できます。各数値は回転する必要があります。
回転した後、各桁が数字のままである場合、数値は有効です.0、1、および8は回転してもそれ自体です.2と5は互いに回転できます(この場合、それらは異なる方向に回転します。言葉、2と5はお互いの鏡像です); 6と9の場合も同じですが、ローテーション後、これら以外の番号は有効な番号ではなくなります。
これで正の整数Nが得られました。Xは1からNまでのいくつの数が適切な数ですか?
例:
入力:10
出力:4
説明:
[1、10]には4つの適切な数値があります
。2、5、6、9です。1と10は回転後に変更されないため、適切な数値ではないことに注意してください。
主題分析
この問題は再帰的に解決できます。この問題を解決するときは、剰余を求める操作を使用して、単位の桁が適切な数の条件を満たすかどうかを判断します。次に、除算を使用して、10の位、100の位、または1000の位が適切かどうかを判断します数。
n%10の後で、プログラムは残りが適切な数と一致し、有効かどうかを判断します。n%10が無効で適切な数でない場合は、falseを返します。
単位の桁が有効または良い場合は、十の桁が判断され、次に千の桁が判断され、以下同様に最上位の桁まで続きます。有効な条件が満たされている場合、マーキングに使用されるブール関数はTrueに割り当てられます。最高の場所に配置し、それらの1つは良い数です。
コード
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
}
結果