チョコ煮

読者です 読者をやめる 読者になる 読者になる

チョコ煮

いろんな素材をチョコで煮ます

人力検索はてなを使ってみた(線形代数問題解決編)

 

bittersweetchocolate.hatenablog.jp

 上の問題が手計算では解けなかったので、コンピュータでの総当たりを想定して回答を募集したところ、次のような回答をいただきました。

q.hatena.ne.jp

itaさんからの回答でCのソースをいただきました。

以下、引用。

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

int target[5]={12,20,25,32,27};

int main(int argc, char **argv)
{
    int x1,x2,x3,x4;
    for(x1=1;x1<=40;x1++) {
    for(x2=x1;x2<=40;x2++) {
    for(x3=x2;x3<=40;x3++) {
    for(x4=x3;x4<=40;x4++) {
        int flag[5]={0,0,0,0,0};

        int a1,a2,a3,a4;
        for(a1=-1;a1<=1;a1++){
        for(a2=-1;a2<=1;a2++){
        for(a3=-1;a3<=1;a3++){
        for(a4=-1;a4<=1;a4++){

            int sum=x1*a1+x2*a2+x3*a3+x4*a4;

            int t;
            for(t=0;t<5;t++)if(sum==target[t])flag[t]=1;

        }}}}
        int sum=0;
        int t;
        for(t=0;t<5;t++)sum+=flag[t];

        if(sum==5)printf("%d %d %d %d\n",x1,x2,x3,x4);
    }}}}
}

 これをコンパイルして実行したところ、(x1, x2, x3, x4)の組は6482通りでした。

 

検算のためにitaさんのソースをちょっといじってこんな風にしたところ、特に問題ありませんでした。

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

int target[5] = { 12,20,25,32,27 };

int main(int argc, char **argv)
{
 int x1, x2, x3, x4;

 for (x1 = 1; x1 <= 40; x1++) {
 for (x2 = x1; x2 <= 40; x2++) {
 for (x3 = x2; x3 <= 40; x3++) {
 for (x4 = x3; x4 <= 40; x4++) {

  int flag[5] = { 0,0,0,0,0 };

  int a1, a2, a3, a4;
  int b1[5]={ 100,100,100,100,100 };
  int b2[5]={ 100,100,100,100,100 };
  int b3[5]={ 100,100,100,100,100 };
  int b4[5]={ 100,100,100,100,100 };
  int sum;

   for (a1 = -1; a1 <= 1; a1++) {
   for (a2 = -1; a2 <= 1; a2++) {
   for (a3 = -1; a3 <= 1; a3++) {
   for (a4 = -1; a4 <= 1; a4++) {

    int sum1 = x1*a1 + x2*a2 + x3*a3 + x4*a4;
    int t;
    for (t = 0; t<5; t++) {
     if (sum1 == target[t]) {
     flag[t] = 1;
     b1[t]=a1;
     b2[t]=a2;
     b3[t]=a3;
     b4[t]=a4;
     }
    }

   }
   }
   }
   }
   int sum1 = 0;
   int t;
   for (t = 0; t<5; t++)sum1 += flag[t];
   if (sum1 == 5) {
    for (t=0; t<5; t++) {
    sum = x1*b1[t] + x2*b2[t] + x3*b3[t] + x4*b4[t];
    printf("%d %d %d %d %d %d %d %d %d\n", x1, x2, x3, x4, b1[t], b2[t], b3[t], b4[t], sum);
    }
   }
 }
 }
 }
 }
}

以下、答えと検算結果です。アップローダから落としてください。パスワードは特にかけておりません。

 http://www1.axfc.net/u/3531762.zip 

 

ホントはExcel VBAで組んでみたんですが、なぜかうまくいかなかったので、Visual Studio 15のフリーのやつをダウンロードし、Cで書きました。

VBAよりCのほうがとっつきやすいって一体……。