動機・やりたいこと
車に乗ったとき、前の車のナンバーで10を作る計算をしています。(家族が乗っているときに、たまに)
で、どんな組み合わせだと10になるかなーって思ったので計算させました。
作成環境
- FreeBSD 14.3-RELEASE-p5 GENERIC amd64
- FreeBSD clang version 19.1.7
Target: x86_64-unknown-freebsd14.3
Thread model: posix
ソースです。(無駄があるのは承知の上で)
計算ルール
- 4桁(0000-9999)で、各桁の数字を入れ替えることはしない。
- 四則演算のみ、()とか累乗の計算はしない。
- 四則演算を入れ替えての計算は行う。
- 計算結果が10になったもののみ表示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int calc(float, float, float, float);
int main()
{
int a, b, c, d;
for(a=0; a<10; a++)
for(b=0; b<10; b++)
for(c=0; c<10; c++)
for(d=0; d<10; d++)
calc((float)a,(float)b,(float)c,(float)d);
return 0;
}
int calc(float a, float b, float c, float d)
{
/*** less / ***/
if( a+b-c*d == 10) printf("%d+%d-%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a+b*c-d == 10) printf("%d+%d*%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b+c*d == 10) printf("%d-%d+%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b*c+d == 10) printf("%d-%d*%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a*b-c+d == 10) printf("%d*%d-%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a*b+c-d == 10) printf("%d*%d+%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
/*** less * ***/
if(d != 0)
{
if( a+b-c/d == 10) printf("%d+%d-%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b+c/d == 10) printf("%d-%d+%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(c != 0)
{
if( a+b/c-d == 10) printf("%d+%d/%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b/c+d == 10) printf("%d-%d/%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(b != 0)
{
if( a/b-c+d == 10) printf("%d/%d-%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a/b+c-d == 10) printf("%d/%d+%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
/*** less + ***/
if(d != 0)
{
if( a*b-c/d == 10) printf("%d*%d-%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b*c/d == 10) printf("%d-%d*%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(c != 0)
{
if( a*b/c-d == 10) printf("%d*%d/%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a-b/c*d == 10) printf("%d-%d/%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(b != 0)
{
if( a/b-c*d == 10) printf("%d/%d-%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a/b*c-d == 10) printf("%d/%d*%d-%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
/*** less - ***/
if(d != 0)
{
if( a*b+c/d == 10) printf("%d*%d+%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a+b*c/d == 10) printf("%d+%d*%d/%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(c != 0)
{
if( a*b/c+d == 10) printf("%d*%d/%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a+b/c*d == 10) printf("%d+%d/%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
if(b != 0)
{
if( a/b+c*d == 10) printf("%d/%d+%d*%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
if( a/b*c+d == 10) printf("%d/%d*%d+%d = 10\r\n",(int)a, (int)b, (int)c, (int)d);
}
return (int)1000*a+100*b+10*c+d;
}
結果
結果ですが、膨大な行数なのでテキストファイルへのリンクを張っておきます。
4keta.txt
ふり返り
-
wc -l 4keta.txtだと3303行と出ました。多いか少ないかは分かりません。 - ゼロ除算の処理はもっとスマートな方法がありますが、実装の方法をこれから覚えたいです。
- 4桁を入れると即座に計算を表示させるWebアプリを作ってみたいです。