作者: sugi
日時: 2002/6/21(20:19)
sugiです。

In message "[TSfree:212] WC の合い間に 111111"
Fri, 21 Jun 2002 14:36:06 +0900 (JST)
Tsutomu Hiroshima <tsutomu@...> wrote:

> 突然ですが,2 と 5 の倍数以外は,
> 適当な数を掛けると全ての桁に 1 が並びます.

> 3 * 37 = 111
> 7 * 15873 = 111111
> 13 * 8547 = 111111

面白そうですね。
私も Ruby 版で考えてみました。

--^ test1.rb
#! ruby

def f(n)
  return 0 if n%2==0 or n%5==0
  i=11
  i=i*10+1 until i%n==0
  return i/n
end

while num=ARGV.shift
  num=num.to_i
  if f(num)==0
    puts "#{num} is Wrong Number"
  else 
    puts "#{num} * #{f(num)} = #{num*f(num)}"  
  end
end
--$

% ruby test1.rb 3 7 9 12 13 43
3 * 37 = 111
7 * 15873 = 111111
9 * 12345679 = 111111111
12 is Wrong Number
13 * 8547 = 111111
43 * 2583979328165374677 = 111111111111111111111

そういえば、以前、数値を素数の積に分解するスクリプトを作って遊んで
いました。
こんな感じです。

--^ test2.rb
#! ruby

# num を素因数分解して求まる最小の素数を探す。
def sosuu(n)
  return n if n  ==0 or n  ==1
  return 2 if n%2==0
  return 3 if n%3==0
  return 5 if n%5==0
  for i in 7..n**0.5
    if i%2==0 or i%3==0 or i%5==0 
      next
    elsif n%i==0
      return i
      break
    end
  end
  return n
end

while num=ARGV.shift
  num=num.to_i
  a,n=[],num
  until sosuu(n)==n
    a<<sosuu(n)
    n=n/sosuu(n)
  end
  a<<n
  puts  %Q|#{num} =  #{a.join("*")}|
end
--$

ruby test2.rb 111 1111 11111 111111 1111111111
111 =  3*37
1111 =  11*101
11111 =  41*271
111111 =  3*7*11*13*37
1111111111 =  11*41*271*9091

--
sugi