作者: Tsutomu Hiroshima
日時: 2002/6/21(14:36)
廣島です.

突然ですが,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 !!