Quantcast
Channel: 円周率近似値の日に生まれて理系じゃないわけないだろ! - knifeのblog
Viewing all articles
Browse latest Browse all 5376

マーティン・ガードナー その2

$
0
0

マーティン・ガードナーの最難題なのだが、これが結構面白いというか厄介だった。

一番最初に組んだのが、

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int a, b, c, d, e, f, g, h;
  int i, j, k, l, m, n, o, p;
  int q, r, s, t, u, v;
  unsigned __int64 w, x;
  int y, z;

  z = 1;
  for (a=1; a<10; a++)
  for (b=a; b<10; b++)
  for (c=b; c<10; c++)
  for (d=c; d<10; d++)
  for (e=d; e<10; e++)
  for (f=e; f<10; f++)
  for (g=f; g<10; g++)
  for (h=g; h<10; h++)
  for (i=h; i<10; i++)
  for (j=i; j<10; j++)
  for (k=j; k<10; k++)
  for (l=k; l<10; l++)
  for (m=l; m<10; m++)
  for (n=m; n<10; n++)
  for (o=n; o<10; o++)
  for (p=o; p<10; p++)
  for (q=p; q<10; q++)
  for (r=q; r<10; r++)
  for (s=r; s<10; s++)
  for (t=s; t<10; t++)
  for (u=t; u<10; u++)
  for (v=u; v<10; v++) {
    w  = a*b*c*d*e*f*g*h;
    w *= i*j*k*l*m*n*o*p;
    w *= q*r*s*t*u*v;
    y = 0;
    while ( w > 9 ) {
      x = 1L;
      y ++;
      while ( w ) {
        x *= w%10;
        w /= 10;
      }
      w = x;
    }
    if ( y >= z ) {
      z = y+1;
      printf("%d%d%d%d%d%d%d%d", a, b, c, d, e, f, g, h);
      printf("%d%d%d%d%d%d%d%d", i, j, k, l, m, n, o, p);
      printf("%d%d%d%d%d%d : %d\n", q, r, s, t, u, v, z);
    }
  }

  return EXIT_SUCCESS;
}


__int64は、Borland Cの64ビット整数なので、他の環境ではそれにあったものに置き換えないとコンパイルが通らない。

枝刈りもなにもしてないのだが、私のCore i7のマシンで実行したところ、1秒もかからずに粘度11まで導きだしてくれるので、プログラムの方向性の目処はついた。

> mg22
1111111111111111111125 : 2
1111111111111111111139 : 3
1111111111111111111177 : 4
1111111111111111111679 : 5
1111111111111111116788 : 6
1111111111111111168889 : 7
1111111111111112677889 : 8
1111111111111126888999 : 9
1111111111113778888999 : 10
1111111277777788888899 : 11

この問題は、掛け算なので、1でパッティングされているが、1を取り除いたのが答えということです。
また、プログラムの性質上粘度1は求めない。


粘度11は64ビット整数で求められたが、これ以降は多倍長演算をしないことには難しいだろうことは予想できる。

もし、粘度12も、粘度11の

277777788888899-4996238671872-438939648-4478976-338688-27648-2688-768-336-54-20-0

の系統で現れるとするならば、

4996238671872=2^19*3^4*7^6

より、19+4+6=29桁以内で見つかることとなる。

粘度12が、粘度11と同じ系統で現れるかはわからないので、とりあえず100桁くらいの多倍長演算で動かしながら、もう少し調査してみることとする。

つづく

Viewing all articles
Browse latest Browse all 5376

Trending Articles