スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

割り切れる4桁の逆転数

Gushwellさんのところに載っていたものについてBLUEPIXYさんが言及していた問題
 
問題
4桁の数値を順序を逆転させた数値(例えば、5432の場合は2345が逆転させた数値)で割ったときに、
割り切れる4桁の数を求めよ。 (5432 / 2345 は割り切れないので求める答えではない) 
ただし、商が1のものや、割る数が4桁でないものは除外する。
 
GushwellさんやBLUEPIXYさんが書いていたコードが、とても自分好みなのですが、無理やり他の方法でやってみました。
 
命令型っぽく(?)4重ループで解いてみたものと関数型っぽく書いてみたもの(余計な処理が一杯)の両極端な二つです。処理速度はかなり違います。
 
let f =
       [ for a in 1 .. 9 do
           for b in 0 .. 9 do
            for c in 0 .. 9 do
              for d in 1 .. a-1 do
                let t = 1000*a+100*b+10*c+d
                if t % (1000*d+100*c+10*b+a) = 0 then
                    yield t ]     

 
let g =
  let crossProduct (ingred : 'a list list) = 
    let rec product rem res = 
        match rem with 
        | [] -> res 
        | h ::tl -> product tl [for i in h do for j in res do yield (i :: j) ]  
 
    product (ingred.Tail) (List.map (fun x -> [x]) ingred.Head) 
    |> List.map (fun lst -> List.rev lst) 
 
 
  let fillCondition il =
    let rec sub res1 res2 order lst =
      match lst with
      |[] -> if res1 <> res2 && res1 % res2 = 0 then Some(res1)
             else None
      |h :: t ->  sub (res1*10 + h) (res2 + h * order) (10 * order) t 
    
    sub  0 0 1 il
 
 
  crossProduct [[1..9];[0..9];[0..9];[1..9]]
   |> List.map fillCondition
   |> List.filter (fun s -> s.IsSome)
   |> List.map (fun s -> s.Value)
   
 
> f;;
val it : int list = [8712; 9801]
 
> g;;
val it : int list = [9801; 8712] 

9801というのが、しゃれています。主記憶容量最大640キロバイトでした。

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。