2

私は R クラスで演習を行っています。お役に立てれば幸いです。タスクは、数値が回文であるかどうかを判断する独自のスクリプトを作成することです。私のアイデアは、任意のサイズの数値で各桁を記録し、それらの桁を順番に比較し、その数値が回文であるかどうかを呼び出す繰り返し構造を作成することでした。

これまでのところ、次のように「for」コマンドを使用して数値を分解できると考えていました。

# Initialize
Number <- 242   
Number

N <- nchar(Number)    
N

# Find numbers and digits
if (Number == 0) {
    print ("Number must be greater than 0")
}

if (Number < 0) {
    print ("Number must be greater than 0")
}

for (i in 1:N) {
    print (Number)
    Digit <- Number %/% 10^(N-1)
    print (Digit)
    Number <- Number %% 10^(N-1)
    N <- N-1
}

ただし、問題は、この構造体が各ループで変数を上書きするため、ループが完了するとすべての数字を個別に出力できないことです。各ループで生成された数字を印刷して記録するように R に命令できますか? ご協力いただきありがとうございます。

4

2 に答える 2

2

Rで回文性をチェックするより良い方法があります。それについては、他の回答を参照してください。for ループ中に物事を追跡するという特定の問題の場合、1 つのアプローチは、for ループと同じ長さのベクトルを作成し、ループのth 反復でiベクトルの th 要素に割り当てることです。i

Number <- 12345
N <- nchar(Number)
backwardsDigits <- numeric(N) ## a vector of numerics of length N
for (i in N:1) {
    backwardsDigits[i] <- Number %/% 10^(i-1)
    Number <- Number %% 10^(i-1)
}

backwardsDigits

all(backwardsDigits == rev(backwardsDigits))

ループ内にforwardsDigits書き込むことで代わりに使用できます。ループ中は何もforwardsDigits[N - i + 1]する必要はありませんが、デバッグには役立ちます。print

于 2012-09-24T02:30:16.917 に答える
1

@thelatemail が示唆したように、これを行う別の (おそらくより直感的な方法) があります。

まず、数値 117711 を文字列に変換して分割しましょう。

charsplit <- strsplit(as.character(117712), "")

[[1]]
[1] "1" "1" "7" "7" "1" "2"

次に、リスト形式から取り出して逆にします

revchar <- rev(unlist(charsplit))

[1] "2" "1" "7" "7" "1" "1"

最後に、これらを貼り付けて数値に変換します。

palinum <- as.numeric(paste(revchar, collapse=""))

[1] "217711"

次に、それらが同一であるかどうかを確認できます。

117712 == palinum

[1] FALSE

私たちのためにそれを行う関数を書くことさえできます。

is.palindrome <- function(number){
  charsplit <- strsplit(as.character(number), "")
  revchar <- rev(unlist(charsplit))
  palinum <- as.numeric(paste(revchar, collapse=""))

  number==palinum
}

is.palindrome(117712)
[1] FALSE

is.palindrome(117711)
[1] TRUE
于 2012-09-24T03:16:00.680 に答える