結果

問題 No.39 桁の数字を入れ替え
ユーザー neko_the_shadowneko_the_shadow
提出日時 2016-09-18 00:07:23
言語 Scheme
(Gauche-0.9.14)
結果
RE  
実行時間 -
コード長 1,407 bytes
コンパイル時間 174 ms
コンパイル使用メモリ 6,948 KB
実行使用メモリ 16,384 KB
最終ジャッジ日時 2024-11-17 08:21:13
合計ジャッジ時間 1,319 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

; 数字をベクタに変換する ex. 981 => #(9 8 1)
(define (number->vector number)
    (let loop ((x number) (ls '()))
        (if (zero? x)
            (list->vector ls)
            (loop (quotient x 10) (cons (modulo x 10) ls)))))

; ベクタをスワップする ex. (vector-swap #(9 8 1) 0 1) => #(8 9 1)
(define (vector-swap! v a b)
    (let ((temp (vector-ref v a)))
        (vector-set! v a (vector-ref v b))
        (vector-set! v b temp)
        v))

; ベクタを数字に変換する ex. #(9 8 1) => 981
(define (vector->number v)
    (let loop ((i 0) (number 0))
        (if (= i (vector-length v))
            number
            (loop (+ i 1)
                  (+ (* 10 number) (vector-ref v i))))))

; 1. 最上位以外において、もっとも大きい数字xを探す
; 2. xが最上位の数より大きい場合はswap
(define (solve n)
    (let ((v (number->vector n)))
        (let loop ((i (- (vector-length v) 1)) 
                   (t (- (vector-length v) 1)))
            (if (zero? i)
                (if (< (vector-ref v i) (vector-ref v t))
                    (vector->number (vector-swap! v i t))
                    (vector->number v))
                (if (> (vector-ref v i) (vector-ref v t))
                    (loop (- i 1) i)
                    (loop (- i 1) t))))))


(define (MAIN)
    (let ((n (read)))
        (display (solve n))
        (newline))

(MAIN)
0