4桁のそれぞれの数を計算したら10になる数は何種類あるか。

0000〜9999までの10000個の4桁の数のそれぞれの数。
これを、+,-,*,/,()を使って10にするというゲーム。(たとえば、8493:*1/7=10、1632:1+(6*3)/2=10、8896:(8*8)-(9*6)=10、1377:(1+(3/7))*7=10
ちなみに、計算して10になることができる一番小さい数は、0019:*2/9=10、でした。
ちなみに、答えが9だと6169個、11だと4990個、12だと6087個、15だと4920個、20だと4276個ありました。
12はさすが約数が多いぶん、個数も多い。
もしかして、約数の数の多さと自身の数の大きさはこの問題の答えの数と比例したりするのだろうか?


なんとなく、ソースコードを公開しておく。
((1+1)+1)+1をすでに計算しているにも関わらず、1+((1+1)+1)も計算しちゃうというなんとも非効率なプログラムです。
公開するのにコメントすらつけてないっていう。

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

#define kotae 10

int kazu=0;

double keisan(double x,double y,int k){
 switch(k){
  case 0:
   return x+y;
  case 1:
   return x-y;
  case 2:
   return x*y;
  case 3:
   return x/y; 
 }
}

char mark(int k){
 switch(k){
  case 0:
   return '+';
  case 1:
   return '-';
  case 2:
   return '*';
  case 3:
   return '/';
 }
}


void equalkotae(int s,int t,int u,int v)
{
 int kigou1,kigou2,kigou3;
 int jun;
 double ans;
 
 for(kigou1=0;kigou1<=3;kigou1++){
 for(kigou2=0;kigou2<=3;kigou2++){
 for(kigou3=0;kigou3<=3;kigou3++){
 for(jun=1;jun<=5;jun++){
  switch(jun)
  {
   case 1:
    ans=keisan(keisan(keisan(s,t,kigou1),u,kigou2),v,kigou3);
    break;
   case 2:
    ans=keisan(keisan(s,t,kigou1),keisan(u,v,kigou3),kigou2);
    break;
   case 3:
    ans=keisan(keisan(s,keisan(t,u,kigou2),kigou1),v,kigou3);
    break;
   case 4:
    ans=keisan(s,keisan(keisan(t,u,kigou2),v,kigou3),kigou1);
    break;
   case 5:
    ans=keisan(s,keisan(t,keisan(u,v,kigou3),kigou2),kigou1);
  }
  if(ans==kotae) {kazu++; goto end;}
 }}}}
 end:;

 FILE *fp;
 
 if((fp=fopen("kekka.dat","a"))==NULL)
 {
  printf("ファイルが作成できません---kekka.dat");
  exit(EXIT_FAILURE);
 }
 if(ans==kotae)
 {
  switch(jun)
  {
   case 1:
    fprintf(fp,"%d%d%d%d:((%d%c%d)%c%d)%c%d=%d\n",s,t,u,v,s,mark(kigou1),t,mark(kigou2),u,mark(kigou3),v,kotae);
    break;
   case 2:
    fprintf(fp,"%d%d%d%d:(%d%c%d)%c(%d%c%d)=%d\n",s,t,u,v,s,mark(kigou1),t,mark(kigou2),u,mark(kigou3),v,kotae);
    break;
   case 3:
    fprintf(fp,"%d%d%d%d:(%d%c(%d%c%d))%c%d=%d\n",s,t,u,v,s,mark(kigou1),t,mark(kigou2),u,mark(kigou3),v,kotae);
    break;
   case 4:
    fprintf(fp,"%d%d%d%d:%d%c((%d%c%d)%c%d)=%d\n",s,t,u,v,s,mark(kigou1),t,mark(kigou2),u,mark(kigou3),v,kotae);
    break;
   case 5:
    fprintf(fp,"%d%d%d%d:%d%c(%d%c(%d%c%d))=%d\n",s,t,u,v,s,mark(kigou1),t,mark(kigou2),u,mark(kigou3),v,kotae);
  }
 }
 else
 {
  fprintf(fp,"%d%d%d%d:答えが%dになる計算はありません\n",s,t,u,v,kotae);
 }
  if(s+t+u+v==36) fprintf(fp,"計算して結果が%dになることができる4桁の数は%d個ある",kotae,kazu);
 fclose(fp);
}

int main(void)
{
 int a,b,c,d;
 
 for(a=0;a<=9;a++){
 for(b=0;b<=9;b++){
 for(c=0;c<=9;c++){
 for(d=0;d<=9;d++){
  equalkotae(a,b,c,d);
 }}}}
}

*1:8-4)+9)-3=10) ふと思い立って、これを自動的に計算してくれるプログラムをC言語で作ってみた。 結果、計算して10にできる数は5876個あるとのことだ。 なかには、人間がやるとなかなかわからないだろうなという答えもあった。 たとえば、5597:(5*(5+9

*2:0+0)+1)+9=10、 一番大きい数は、9999:(9+(9*9