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畳くらいのプレハブを横に建っていけるんだけどなー。
解速度
即