廣島です.
突然ですが,2 と 5 の倍数以外は,
適当な数を掛けると全ての桁に 1 が並びます.
3 * 37 = 111
7 * 15873 = 111111
13 * 8547 = 111111
17 * 65359477124183 = (16桁)
19 * 5847953216374269 = (18桁)
21 * 5291 = 111111
23 * 48309178743961352657 = (22桁)
27 * 4115226337448559670781893 = (27桁)
少し跳んで,
49 * 2267573696145124716553287981859410430839 = (42桁)
81 * 1371742112482853223593964334705075445816186556927297668038408779149519890260631 = (81 桁)
桁制限無の整数オブジェクトが使えるスクリプト言語が便利です.
私の知っているのは Scheme と Ruby です.;; Lisp も使えたっけ?
Perl には Math::BigInt と言うパッケージが有りますが,
変な使い方をさせられます.(そのため,引数に制限有り)
;; Scheme 版
;; x に対し,x * y = 111...111 となる y を計算し,
;; y, および 111...111 の桁数のリストを返す.
;; 不正な引数 x にはリスト ("Wrong Number" x) を返す.
;; (f 3) ==> (37 3)
(define (f x)
(cond
((or (not (integer? x)) (< x 1)) (list "Wrong Number" x))
((= x 1) (list 1 1))
(else
(let ((r (remainder 10 x)) (q (quotient 10 x)))
(let repeat ((m r) (n q) (a 1) (b 0) (c 1))
(if (zero? (remainder m x))
(list "Wrong Number" x)
(if (zero? (remainder a x))
(list (+ (quotient a x) b) c)
(let ((p (* m r)))
(repeat (remainder p x)
(+ (* 10 n) (* m q) (quotient p x))
(+ a m)
(+ b n)
(+ c 1))))))))))
## Ruby 版
## x に対し,x * y = 111...111 となる y を計算し,
## y, および 111...111 の桁数の配列を返す.
## 不正な引数 x には配列 ["Wrong Number", x] を返す.
## f(3) ==> [37, 3]
def f(x)
if ! x.is_a?(Integer) || x < 1
return ["Wrong Number", x]
elsif x == 1
return [1, 1]
else
r = 10 % x; q = 10 / x
m = r; n = q; a = 1; b = 0; c = 1
loop do
if m % x == 0
return ["Wrong Number", x]
elsif a % x == 0
return [b + a / x, c]
else
a += m; b += n; c += 1
p = m * r
n = n * 10 + m * q + p / x
m = p % x
end
end
end
end
## Perl 版
## $x に対し,$x * $y = 111...111 となる BigInt $y を計算し,
## $y, および 111...111 の桁数の配列を返す.
## 不正な引数 x には配列 ("Wrong Number", $x) を返す.
## f(3) ==> (37, 3)
## 引数は通常の整数の範囲内であること.
use Math::BigInt;
sub f {
my $x = shift;
if ($x !~ /^\d+$/) {
return ("Wrong Number", $x);
} elsif ($x == 1) {
return (1, 1, 1);
} else {
my ($r, $q) = (10 % $x, int(10 / $x));
my $n = Math::BigInt->new($q);
my $b = Math::BigInt->new(0);
my ($m, $a, $c) = ($r, 1, 1);
while (1) {
if ($m % $x == 0) {
return ("Wrong Number", $x);
} elsif ($a % $x == 0) {
return ($b->badd($a / $x), $c);
} else {
$a += $m; $b = Math::BigInt->new($b->badd($n)); $c ++;
my $p = $m * $r;
$n = Math::BigInt->new($n->bmul(10));
$n = Math::BigInt->new($n->badd($m * $q + int($p / $x)));
$m = $p % $x;
}
}
}
}
TeX 版,Metafont 版はちょっと無理かな...
PostScript 版は,(Perl 版を見てもわかるように)
桁制限無の整数に対する演算は,和と,積だけなので,
配列を使いつつこれらの演算を実現すればできるかも.
一人言語比較でした.
-----------------------------
廣島 勉
(tsutomu@...)
がんばれ DEUTSCHLAND !!