がんばってやってみた。
d:id:hyuki:20090314#piに面白そうな問題があったので、
休日の半日をかけてみた。
嫁がすねた(ぉ
とりあえず、円周率を導出するところは、
http://oss.timedia.co.jp/show/ossz/oneline/2005-05-09のHaskellコードから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]です。