10進数の10の補数

ある10進数nの10の補数を求めようとする場合には、桁数も指定する必要があるそうです。
今まで全然意識していませんでした。。


wikipedia:補数
http://okwave.jp/qa/q2287743.html
http://akademeia.info/index.php?%CA%E4%BF%F4


10進数numberのn桁の10の補数を求める関数10s-compを書く

[tigerii@fedora ~]$ rlwrap gosh
gosh> (define (power n m)
(if (= m 1) n
    (* n (power n (- m 1)))))
power
gosh> (power 10 2)
100
gosh> (power 10 3)
1000
gosh> (power 2 10)
1024
gosh> (define (10s-comp n number)
(- (power 10 n) number))
|10s-comp|

1から9までの1桁の10の補数を求める

gosh> (use srfi-1)
#<undef>
gosh> (define (10s-comp-1 number) (10s-comp 1 number))
|10s-comp-1|
gosh> (iota 9 1 1)
(1 2 3 4 5 6 7 8 9)
gosh> (map 10s-comp-1 (iota 9 1 1))
(9 8 7 6 5 4 3 2 1)

1から99までの2桁の10の補数を求める

gosh> (define (10s-comp-2 number) (10s-comp 2 number))
|10s-comp-2|
gosh> (iota 99 1 1)
(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99)
gosh> (map 10s-comp-2 (iota 99 1 1))
(99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1)



3 - 1 = 3 + (10 - 1) - 10 = 12 - 10 = 2

gosh> (- 3 1)
2
gosh> (+ 3 (10s-comp 1 1))
12



3 - 1 = 3 + (100 - 1) - 100 = 102 - 100 = 2

gosh> (+ 3 (10s-comp 2 1))
102



3 - 1 = 3 + (1000 - 1) - 1000 = 1002 - 1000 = 2

gosh> (+ 3 (10s-comp 3 1))
1002