がんばってやってみた。

d:id:hyuki:20090314#piに面白そうな問題があったので、
休日の半日をかけてみた。
  
嫁がすねた(ぉ
  
とりあえず、円周率を導出するところは、
http://oss.timedia.co.jp/show/ossz/oneline/2005-05-09HaskellコードからJavaにポーティング。
仕組みとか解ってないのがだめだめだったり・・・おもしろそうなので、後で読む。
(理解できるか謎)
  
そして、検算とかしてないけど、他の人とあってるからいいか。。な?(ぉ

package pi;

import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    private static final BigInteger B0  = new BigInteger("0");
    private static final BigInteger B1  = new BigInteger("1");
    private static final BigInteger B2  = new BigInteger("2");
    private static final BigInteger B3  = new BigInteger("3");
    private static final BigInteger B4  = new BigInteger("4");
    private static final BigInteger B7  = new BigInteger("7");
    private static final BigInteger B10 = new BigInteger("10");


    public static void main(String[] args) {
        BigInteger a = new BigInteger("0");
        StringBuffer sb = new StringBuffer();
        long len = -1;
        g(B1, B0, B1, B1, B3, B3, len ,sb);

    }

    public static void g(
            BigInteger q,
            BigInteger r,
            BigInteger t,
            BigInteger k,
            BigInteger n,
            BigInteger l,
            long len,
            StringBuffer sb) {

        //4 * q + r - t < n * t
        if ((B4.multiply(q).add(r).subtract(t)).compareTo(n.multiply(t)) == -1) {
            if (sb.length()<10){
                sb.append(n.toString());
            }else{
                if(!check(sb)){
                    ++len;
                    sb.deleteCharAt(0).append(n.toString());
                }else{
                    //みっけた
                    System.out.println("小数点第"+(len+1)+"くらい");
                    System.out.println("値は["+sb.toString()+"]です。");
                    System.exit(0);

                }
            }
            

                g(
                        B10.multiply(q), // 10*q
                        B10.multiply(r.subtract(n.multiply(t))), // 10*(r-n*t)
                        t, // t
                        k, // k
                        ((B10.multiply(B3.multiply(q).add(r))).divide(t)).subtract(B10.multiply(n)),
                        // div(10*(3*q+r))t-10*n,
                        l, // l
                        len,sb);
        } else {

                g(
                        q.multiply(k), // q*k
                        (B2.multiply(q).add(r)).multiply(l), // (2*q+r)*l
                        t.multiply(l), // t*l
                        k.add(B1), // k+1
                        ((q.multiply(B7.multiply(k).add(B2))).add(r.multiply(l))).divide(t.multiply(l)),
                        // div(q*(7*k+2)+r*l)(t*l)
                        l.add(B2), // l+2
                        len,sb);
        }

    }

    private static boolean check(StringBuffer sb) {
        SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss");
        Date fooData;
        String strData;
        try{
            fooData = sdf.parse(sb.toString());
            strData = sdf.format(fooData);
            if(sb.toString().equals(strData)){
                return true;
            }else{
                return false;
            }

        }catch (Exception ex){
            return false;
        }
    }
}

けっか

小数点第287くらい
値は[0726024914]です。