朝日新聞2006年2月3日のパズル横丁問題

問題

370万円をA,B,Cの3人で分けることになった。Aの取り分>Bの取り分>Cの取り分の関係があり,A÷BとB÷Cが等しくなるようにするには,どのように分ければ良いか?

解答への道(ヒント)

星2つ問題。頭で解くと難しいんだろうなー。

今の世の中CPUも速いしプログラムを作ればチョチョイだぞ。

370万て言っても分けるのは1万単位でしょ。だったら簡単じゃん。

そう思って以下のプログラムを書いて実行してみた。

#include "puzutl.h"

int main( int argc, cstring argv[])
{
  for( int a=1; a< 370; a++) {
    for( int b=1; b< a; b++) {
      for( int c=1; c< b; c++) {
        if( (a%b) == 0 &&
            (b%c) == 0 &&
            (a+b+c) == 370 &&
            (a/b) == (b/c)) {
          ps( "a:%d, b:%d, c:%d\n", a, b, c);
        }
      }
    }
  }
  return    0;
}

ありゃ?答えが出ないぞ。

万単位じゃないのか?

370の代わりに3700000を書いたらとてもじゃないが終わらないぞ。

マズイ,真面目に考えないとダメなのか。次に考えたのが以下のプログラム。これでもダメだ。

もしかして,a÷b,b÷cは整数値じゃないのか。がーん。

int main( int argc, cstring argv[])
{
  const int s370 = 3700000;
  const int cmax = s370 / 3;
  int a, b;
  for( int c=1; c< cmax; c++) {
    for( int m=2; m< 10000; m++) {
      b         = c*m;
      a         = b*m;
      if( a+b+c >  s370) break;
      if( a+b+c == s370) {
        ps( "Find\n");
      }
    }
    if( m == 10000) ps( "Short\n");
  }
  return 0;
}

高校時代を彷彿させるような解き方になった。cを定数値と見なすとbの二次方程式に見える。

√の中身が整数でなければならないので,整数になるものを見つける。

#include "puzutl.h"
#include <math.h>

int main( int argc, cstring argv[])
{
  const int s370 = 3700000;
  const int cmax = s370 / 3;
  int64     ctmp, croot;
  int       a, b;
  for( int c=1; c< cmax; c++) {
    ctmp        = (int64)4*s370*c - (int64)3*c*c;
    if( ctmpの√が整数値になるか?) {
      if( a+b+c == s370) 見つかった
    }
  }
  return    0;
}

答えは1件出力されました。a+b+c==s370 がなくても,ctmpの√が整数になるのは一つしかありませんでした。

 

CD-ROMを使うとついつい出しっぱなしにしてしまう。おかげで必要な時に見つからなかったりする。今年の正月は筆まめのCD-ROMが見つからず困った(結局見つからなかった)。

先日何気なくCD-R50枚セットの真ん中に棒のあるやつに差して使ってみたら「おー,便利便利。何故今まで気づかなかったの?」

これなら使い終わったら直ぐこれに差せば良いじゃん。

ということで,部屋中に散らかっているCD-ROMを少しずつ片づけ始めている。

尤も部屋を片づけないとダメだけど。

あー,長屋みたいな所に住みたい。そして毎年1月1日に隣の部屋に引っ越す。1年なら根雪のようにゴミは貯まらないだろうから。

1年ごとに引っ越して,過去の部屋はずっと使わずに置いておく。そうすれば去年大体どんなことをしていたか判るし,「3年前にやった仕事の資料」とかいうのも見つけやすい。

土地さえあれば毎年3畳くらいのプレハブを横に建っていけるんだけどなー。

解速度