人力検索はてなを使ってみた(線形代数問題解決編)
bittersweetchocolate.hatenablog.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のほうがとっつきやすいって一体……。