Skip to content

Instantly share code, notes, and snippets.

@hakatashi
Created October 14, 2013 13:09
Show Gist options
  • Save hakatashi/6975351 to your computer and use it in GitHub Desktop.
Save hakatashi/6975351 to your computer and use it in GitHub Desktop.
中3のとき(C++歴3ヶ月)に書いた四則solverを恥晒しうp。きたない
// sisoku.cpp | (c) 2009 Hakatashi | Licensed under CC0 1.0 Universal http://creativecommons.org/publicdomain/zero/1.0/
#include <stdio.h>
#include <math.h>
#include <string.h>
/*****************************************************
** 即席で作ったプログラムなので限りなく汚いです。 **
*****************************************************/
int main(void) {
for (;;) {
int t[15],sum=0,tr,tr2,tt=0,ca=0,ansum=0,count;
double array[5],array2[4],array3[3],array4[2],anser,tot,ganser[1000];
double tothe;
double tes=0;
char stop[256],str[5][256],str1[5][256],str2[4][256],str3[3][256],str4[2][256],anser2[1000][256];
for (tr=0;tr<5;tr++) {
printf("%d個目の数値を入力してください。Enterで決定。\n",tr+1);
scanf("%lf",&array[tr]);
}
printf("目標数を入力してください。Enterで決定。\n");
scanf("%lf",&tothe);
printf("計算を開始します。\n");
for (t[0]=0;t[0]<5;t[0]++) { //最初の演算対象を決める
for (t[1]=0;t[1]<t[0];t[1]++) { //二番目の演算対象(一番目よりも先に来る)を決める
for (t[2]=0;t[2]<10;t[2]++) { //演算を決める(加法、減法(二通り)、乗法、除法(二通り))
tt=0;
for (tr=0;tr<5;tr++) {
if (tr!=t[0] && tr!=t[1]) {
array2[tt]=array[tr];
tt++;
}
}
if (t[2]==0) array2[3]=array[t[1]]+array[t[0]]; //加法
if (t[2]==1) array2[3]=array[t[1]]-array[t[0]]; //減法
if (t[2]==2) array2[3]=array[t[0]]-array[t[1]]; //減法(逆)
if (t[2]==3) array2[3]=array[t[1]]*array[t[0]]; //乗法
if (t[2]==4) {
if (array[t[0]]!=0) {
array2[3]=array[t[1]]/array[t[0]]; //除法
}
}
if (t[2]==5) {
if (array[t[1]]!=0) {
array2[3]=array[t[0]]/array[t[1]]; //除法(逆)
}
}
if (t[2]==4 && array[t[0]]==0) break;
if (t[2]==5 && array[t[1]]==0) break;
//累乗
if (t[2]==6 && modf(array[t[1]],&tot)!=0) break;
if (t[2]==6 && fabs(array[t[0]])>=21) break;
if (t[2]==6 && fabs(array[t[1]])>=13) break;
if (t[2]==6 && fabs(array[t[0]])>=4 && fabs(array[t[1]])>=6) break;
if (t[2]==6) {
array2[3]=1;
if (array[t[1]]>=0) {
for (tr=0;tr<array[t[1]];tr++) {
array2[3]*=array[t[0]];
}
} else {
for (tr=0;tr<-(array[t[1]]);tr++) {
array2[3]/=array[t[0]];
}
}
}
//累乗(逆)
if (t[2]==7 && modf(array[t[0]],&tot)!=0) break;
if (t[2]==7 && fabs(array[t[1]])>=21) break;
if (t[2]==7 && fabs(array[t[0]])>=13) break;
if (t[2]==7 && fabs(array[t[1]])>=4 && fabs(array[t[0]])>=6) break;
if (t[2]==7) {
array2[3]=1;
if (array[t[0]]>=0) {
for (tr=0;tr<array[t[0]];tr++) {
array2[3]*=array[t[1]];
}
} else {
for (tr=0;tr<-(array[t[0]]);tr++) {
array2[3]/=array[t[1]];
}
}
}
//乗根
ca=0;
if (t[2]==8) {
if (array[t[1]]==0.5) {ca=1; array2[3]=array[t[0]]*array[t[0]];}
if (array[t[1]]==1) {ca=1; array2[3]=array[t[0]];}
if (array[t[1]]==2 && array[t[0]]>=0) {ca=1; array2[3]=sqrt(array[t[0]]);}
if (array[t[1]]==0.5) {ca=1; array2[3]=1/(array[t[0]]*array[t[0]]);}
if (array[t[1]]==-1) {ca=1; array2[3]=1/array[t[0]];}
if (array[t[1]]==-2 && array[t[0]]>=0) {ca=1; array2[3]=1/sqrt(array[t[0]]);}
}
if (t[2]==8 && ca==0) break;
//乗根(逆)
ca=0;
if (t[2]==9) {
if (array[t[0]]==0.5) {ca=1; array2[3]=array[t[1]]*array[t[1]];}
if (array[t[0]]==1) {ca=1; array2[3]=array[t[1]];}
if (array[t[0]]==2 && array[t[1]]>=0) {ca=1; array2[3]=sqrt(array[t[1]]);}
if (array[t[0]]==0.5) {ca=1; array2[3]=1/(array[t[1]]*array[t[1]]);}
if (array[t[0]]==-1) {ca=1; array2[3]=1/array[t[1]];}
if (array[t[0]]==-2 && array[t[1]]>=0) {ca=1; array2[3]=1/sqrt(array[t[1]]);}
}
if (t[2]==9 && ca==0) break;
for (t[3]=0;t[3]<4;t[3]++) {
for (t[4]=0;t[4]<t[3];t[4]++) {
for (t[5]=0;t[5]<10;t[5]++) {
tt=0;
for (tr=0;tr<4;tr++) {
if (tr!=t[3] && tr!=t[4]) {
array3[tt]=array2[tr];
tt++;
}
}
if (t[5]==0) array3[2]=array2[t[4]]+array2[t[3]]; //加法
if (t[5]==1) array3[2]=array2[t[4]]-array2[t[3]]; //減法
if (t[5]==2) array3[2]=array2[t[3]]-array2[t[4]]; //減法(逆)
if (t[5]==3) array3[2]=array2[t[4]]*array2[t[3]]; //乗法
if (t[5]==4) {
if (array2[t[3]]!=0) {
array3[2]=array2[t[4]]/array2[t[3]]; //除法
}
}
if (t[5]==5) {
if (array2[t[4]]!=0) {
array3[2]=array2[t[3]]/array2[t[4]]; //除法(逆)
}
}
if (t[5]==4 && array2[t[3]]==0) break;
if (t[5]==5 && array2[t[4]]==0) break;
//累乗
if (t[5]==6 && modf(array2[t[4]],&tot)!=0) break;
if (t[5]==6 && fabs(array2[t[3]])>=21) break;
if (t[5]==6 && fabs(array2[t[4]])>=13) break;
if (t[5]==6 && fabs(array2[t[3]])>=4 && fabs(array2[t[4]])>=6) break;
if (t[5]==6) {
array3[2]=1;
if (array2[t[4]]>=0) {
for (tr=0;tr<array2[t[4]];tr++) {
array3[2]*=array2[t[3]];
}
} else {
for (tr=0;tr<-(array2[t[4]]);tr++) {
array3[2]/=array2[t[3]];
}
}
}
//累乗(逆)
if (t[5]==7 && modf(array2[t[3]],&tot)!=0) break;
if (t[5]==7 && fabs(array2[t[4]])>=21) break;
if (t[5]==7 && fabs(array2[t[3]])>=13) break;
if (t[5]==7 && fabs(array2[t[4]])>=4 && fabs(array2[t[3]])>=6) break;
if (t[5]==7) {
array3[2]=1;
if (array2[t[3]]>=0) {
for (tr=0;tr<array2[t[3]];tr++) {
array3[2]*=array2[t[4]];
}
} else {
for (tr=0;tr<-(array2[t[3]]);tr++) {
array3[2]/=array2[t[4]];
}
}
}
//乗根
ca=0;
if (t[5]==8) {
if (array2[t[4]]==0.5) {ca=1; array3[2]=array2[t[3]]*array2[t[3]];}
if (array2[t[4]]==1) {ca=1; array3[2]=array2[t[3]];}
if (array2[t[4]]==2 && array2[t[3]]>=0) {ca=1; array3[2]=sqrt(array2[t[3]]);}
if (array2[t[4]]==0.5) {ca=1; array3[2]=1/(array2[t[3]]*array2[t[3]]);}
if (array2[t[4]]==-1) {ca=1; array3[2]=1/array2[t[3]];}
if (array2[t[4]]==-2 && array2[t[3]]>=0) {ca=1; array3[2]=1/sqrt(array2[t[3]]);}
}
if (t[5]==8 && ca==0) break;
//乗根(逆)
ca=0;
if (t[5]==9) {
if (array2[t[3]]==0.5) {ca=1; array3[2]=array2[t[4]]*array2[t[4]];}
if (array2[t[3]]==1) {ca=1; array3[2]=array2[t[4]];}
if (array2[t[3]]==2 && array2[t[4]]>=0) {ca=1; array3[2]=sqrt(array2[t[4]]);}
if (array2[t[3]]==0.5) {ca=1; array3[2]=1/(array2[t[4]]*array2[t[4]]);}
if (array2[t[3]]==-1) {ca=1; array3[2]=1/array2[t[4]];}
if (array2[t[3]]==-2 && array2[t[4]]>=0) {ca=1; array3[2]=1/sqrt(array2[t[4]]);}
}
if (t[5]==9 && ca==0) break;
for (t[6]=0;t[6]<3;t[6]++) {
for (t[7]=0;t[7]<t[6];t[7]++) {
for (t[8]=0;t[8]<10;t[8]++) {
tt=0;
for (tr=0;tr<3;tr++) {
if (tr!=t[6] && tr!=t[7]) {
array4[tt]=array3[tr];
tt++;
}
}
if (t[8]==0) array4[1]=array3[t[7]]+array3[t[6]]; //加法
if (t[8]==1) array4[1]=array3[t[7]]-array3[t[6]]; //減法
if (t[8]==2) array4[1]=array3[t[6]]-array3[t[7]]; //減法(逆)
if (t[8]==3) array4[1]=array3[t[7]]*array3[t[6]]; //乗法
if (t[8]==4) {
if (array3[t[6]]!=0) {
array4[1]=array3[t[7]]/array3[t[6]]; //除法
}
}
if (t[8]==5) {
if (array3[t[7]]!=0) {
array4[1]=array3[t[6]]/array3[t[7]]; //除法(逆)
}
}
if (t[8]==4 && array3[t[6]]==0) break;
if (t[8]==5 && array3[t[7]]==0) break;
//累乗
if (t[8]==6 && modf(array3[t[7]],&tot)!=0) break;
if (t[8]==6 && fabs(array3[t[6]])>=21) break;
if (t[8]==6 && fabs(array3[t[7]])>=13) break;
if (t[8]==6 && fabs(array3[t[6]])>=4 && fabs(array3[t[7]])>=6) break;
if (t[8]==6) {
array4[1]=1;
if (array3[t[7]]>=0) {
for (tr=0;tr<array3[t[7]];tr++) {
array4[1]*=array3[t[6]];
}
} else {
for (tr=0;tr<-(array3[t[7]]);tr++) {
array4[1]/=array3[t[6]];
}
}
}
//累乗(逆)
if (t[8]==7 && modf(array3[t[6]],&tot)!=0) break;
if (t[8]==7 && fabs(array3[t[7]])>=21) break;
if (t[8]==7 && fabs(array3[t[6]])>=13) break;
if (t[8]==7 && fabs(array3[t[7]])>=4 && fabs(array3[t[6]])>=6) break;
if (t[8]==7) {
array4[1]=1;
if (array3[t[6]]>=0) {
for (tr=0;tr<array3[t[6]];tr++) {
array4[1]*=array3[t[7]];
}
} else {
for (tr=0;tr<-(array3[t[6]]);tr++) {
array4[1]/=array3[t[7]];
}
}
}
//乗根
ca=0;
if (t[8]==8) {
if (array3[t[7]]==0.5) {ca=1; array4[1]=array3[t[6]]*array3[t[6]];}
if (array3[t[7]]==1) {ca=1; array4[1]=array3[t[6]];}
if (array3[t[7]]==2 && array3[t[6]]>=0) {ca=1; array4[1]=sqrt(array3[t[6]]);}
if (array3[t[7]]==0.5) {ca=1; array4[1]=1/(array3[t[6]]*array3[t[6]]);}
if (array3[t[7]]==-1) {ca=1; array4[1]=1/array3[t[6]];}
if (array3[t[7]]==-2 && array3[t[6]]>=0) {ca=1; array4[1]=1/sqrt(array3[t[6]]);}
}
if (t[8]==8 && ca==0) break;
//乗根(逆)
ca=0;
if (t[8]==9) {
if (array3[t[6]]==0.5) {ca=1; array4[1]=array3[t[7]]*array3[t[7]];}
if (array3[t[6]]==1) {ca=1; array4[1]=array3[t[7]];}
if (array3[t[6]]==2 && array3[t[7]]>=0) {ca=1; array4[1]=sqrt(array3[t[7]]);}
if (array3[t[6]]==0.5) {ca=1; array4[1]=1/(array3[t[7]]*array3[t[7]]);}
if (array3[t[6]]==-1) {ca=1; array4[1]=1/array3[t[7]];}
if (array3[t[6]]==-2 && array3[t[7]]>=0) {ca=1; array4[1]=1/sqrt(array3[t[7]]);}
}
if (t[8]==9 && ca==0) break;
for (t[9]=0;t[9]<10;t[9]++) {
if (t[9]==0) anser=array4[0]+array4[1]; //加法
if (t[9]==1) anser=array4[0]-array4[1]; //減法
if (t[9]==2) anser=array4[1]-array4[0]; //減法(逆)
if (t[9]==3) anser=array4[0]*array4[1]; //乗法
if (t[9]==4) {
if (array4[1]!=0) {
anser=array4[0]/array4[1]; //除法
}
}
if (t[9]==5) {
if (array4[0]!=0) {
anser=array4[1]/array4[0]; //除法(逆)
}
}
if (t[9]==4 && array4[1]==0) break;
if (t[9]==5 && array4[0]==0) break;
//累乗
if (t[9]==6 && modf(array4[0],&tot)!=0) break;
if (t[9]==6 && fabs(array4[1])>=21) break;
if (t[9]==6 && fabs(array4[0])>=13) break;
if (t[9]==6 && fabs(array4[1])>=4 && fabs(array4[0])>=6) break;
if (t[9]==6) {
anser=1;
if (array4[0]>=0) {
for (tr=0;tr<array4[0];tr++) {
anser*=array4[1];
}
} else {
for (tr=0;tr<-(array4[0]);tr++) {
anser/=array4[1];
}
}
}
//累乗(逆)
if (t[9]==7 && modf(array4[1],&tot)!=0) break;
if (t[9]==7 && fabs(array4[0])>=21) break;
if (t[9]==7 && fabs(array4[1])>=13) break;
if (t[9]==7 && fabs(array4[0])>=4 && fabs(array4[1])>=6) break;
if (t[9]==7) {
anser=1;
if (array4[1]>=0) {
for (tr=0;tr<array4[1];tr++) {
anser*=array4[0];
}
} else {
for (tr=0;tr<-(array4[1]);tr++) {
anser/=array4[0];
}
}
}
//乗根
ca=0;
if (t[9]==8) {
if (array4[0]==0.5) {ca=1; anser=array4[1]*array4[1];}
if (array4[0]==1) {ca=1; anser=array4[1];}
if (array4[0]==2 && array4[1]>=0) {ca=1; anser=sqrt(array4[1]);}
if (array4[0]==0.5) {ca=1; anser=1/(array4[1]*array4[1]);}
if (array4[0]==-1) {ca=1; anser=1/array4[1];}
if (array4[0]==-2 && array4[1]>=0) {ca=1; anser=1/sqrt(array4[1]);}
}
if (t[9]==8 && ca==0) break;
//乗根(逆)
ca=0;
if (t[9]==9) {
if (array4[1]==0.5) {ca=1; anser=array4[0]*array4[0];}
if (array4[1]==1) {ca=1; anser=array4[0];}
if (array4[1]==2 && array4[0]>=0) {ca=1; anser=sqrt(array4[0]);}
if (array4[1]==0.5) {ca=1; anser=1/(array4[0]*array4[0]);}
if (array4[1]==-1) {ca=1; anser=1/array4[0];}
if (array4[1]==-2 && array4[0]>=0) {ca=1; anser=1/sqrt(array4[0]);}
}
if (t[9]==9 && ca==0) break;
sum++;
if (sum%10000==0) printf("計算中... %8d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d to%f\n",sum,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],anser);
if (anser>(tothe-0.0001) && anser<(tothe+0.0001)) {
ansum++;
ganser[ansum-1]=anser;
printf("計算中... %8d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d to%f\n",sum,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],anser);
printf("\n%d個目の解らしきものが見つかりました。計算を中断します。\n",ansum);
printf("計算結果を解析します....\n");
for (tr=0;tr<5;tr++) {
sprintf(str[tr],"%f",array[tr]);
if (array[tr]>=1000) count=4;
else if (array[tr]>=100) count=3;
else if (array[tr]>=10) count=2;
else count=1;
if (modf(array[tr],&tot)!=0) count+=3;
strncpy(str1[tr],str[tr],count);
str1[tr][count]='\0'; // EOSを付加
//printf("%s ",str1[tr]);
}
//printf("\n");
tt=0;
for (tr=0;tr<5;tr++) {
if (tr!=t[0] && tr!=t[1]) {
strcpy(str2[tt],str1[tr]);
//str2[tt][1]='\0';
tt++;
}
}
for (tr=0;tr<3;tr++) {
//printf("%s ",str2[tr]);
}
if (t[2]==0 || t[2]==1 || t[2]==3 || t[2]==4 || t[2]==7 || t[2]==8) {
switch (t[2]) {
case 0:
strcpy(stop,"+");
break;
case 1:
strcpy(stop,"-");
break;
case 3:
strcpy(stop,"*");
break;
case 4:
strcpy(stop,"/");
break;
case 7:
strcpy(stop,"^");
break;
case 8:
strcpy(stop,"#");
break;
}
sprintf(str2[3],"%s%s%s%s%s","(",str1[t[1]],stop,str1[t[0]],")");
}
if (t[2]==2 || t[2]==5 || t[2]==6 || t[2]==9) {
switch (t[2]) {
case 2:
strcpy(stop,"-");
break;
case 5:
strcpy(stop,"/");
break;
case 6:
strcpy(stop,"^");
break;
case 9:
strcpy(stop,"#");
break;
}
sprintf(str2[3],"%s%s%s%s%s","(",str1[t[0]],stop,str1[t[1]],")");
}
//printf("%s ",stop);
//printf("%s\n",str2[3]);
tt=0;
for (tr=0;tr<4;tr++) {
if (tr!=t[3] && tr!=t[4]) {
strcpy(str3[tt],str2[tr]);
tt++;
}
}
for (tr=0;tr<2;tr++) {
//printf("%s ",str3[tr]);
}
if (t[5]==0 || t[5]==1 || t[5]==3 || t[5]==4 || t[5]==7 || t[5]==8) {
switch (t[5]) {
case 0:
strcpy(stop,"+");
break;
case 1:
strcpy(stop,"-");
break;
case 3:
strcpy(stop,"*");
break;
case 4:
strcpy(stop,"/");
break;
case 7:
strcpy(stop,"^");
break;
case 8:
strcpy(stop,"#");
break;
}
sprintf(str3[2],"%s%s%s%s%s","(",str2[t[4]],stop,str2[t[3]],")");
}
if (t[5]==2 || t[5]==5 || t[5]==6 || t[5]==9) {
switch (t[5]) {
case 2:
strcpy(stop,"-");
break;
case 5:
strcpy(stop,"/");
break;
case 6:
strcpy(stop,"^");
break;
case 9:
strcpy(stop,"#");
break;
}
sprintf(str3[2],"%s%s%s%s%s","(",str2[t[3]],stop,str2[t[4]],")");
}
//printf("%s ",stop);
//printf("%s\n",str3[2]);
tt=0;
for (tr=0;tr<3;tr++) {
if (tr!=t[6] && tr!=t[7]) {
strcpy(str4[tt],str3[tr]);
tt++;
}
}
for (tr=0;tr<1;tr++) {
//printf("%s ",str4[tr]);
}
if (t[8]==0 || t[8]==1 || t[8]==3 || t[8]==4 || t[8]==7 || t[8]==8) {
switch (t[8]) {
case 0:
strcpy(stop,"+");
break;
case 1:
strcpy(stop,"-");
break;
case 3:
strcpy(stop,"*");
break;
case 4:
strcpy(stop,"/");
break;
case 7:
strcpy(stop,"^");
break;
case 8:
strcpy(stop,"#");
break;
}
sprintf(str4[1],"%s%s%s%s%s","(",str3[t[7]],stop,str3[t[6]],")");
}
if (t[8]==2 || t[8]==5 || t[8]==6 || t[8]==9) {
switch (t[8]) {
case 2:
strcpy(stop,"-");
break;
case 5:
strcpy(stop,"/");
break;
case 6:
strcpy(stop,"^");
break;
case 9:
strcpy(stop,"#");
break;
}
sprintf(str4[1],"%s%s%s%s%s","(",str3[t[6]],stop,str3[t[7]],")");
}
//printf("%s",stop);
//printf("%s",str4[1]);
if (t[9]==0 || t[9]==1 || t[9]==3 || t[9]==4 || t[9]==7 || t[9]==8) {
switch (t[9]) {
case 0:
strcpy(stop,"+");
break;
case 1:
strcpy(stop,"-");
break;
case 3:
strcpy(stop,"*");
break;
case 4:
strcpy(stop,"/");
break;
case 7:
strcpy(stop,"^");
break;
case 8:
strcpy(stop,"#");
break;
}
sprintf(anser2[ansum-1],"%s%s%s",str4[0],stop,str4[1]);
}
if (t[9]==2 || t[9]==5 || t[9]==6 || t[9]==9) {
switch (t[9]) {
case 2:
strcpy(stop,"-");
break;
case 5:
strcpy(stop,"/");
break;
case 6:
strcpy(stop,"^");
break;
case 9:
strcpy(stop,"#");
break;
}
sprintf(anser2[ansum-1],"%s%s%s",str4[1],stop,str4[0]);
}
//printf("\n%s\n",stop);
printf("計算結果:");
printf("%s\n計算を再開します。\n\n",anser2[ansum-1]);
}
}
}
}
}
}
}
}
}
}
}
printf("\n");
printf("%d回の計算の後に",sum);
if (ansum==0) printf("解は見つかりませんでしたorz\n");
if (ansum>0) {
printf("%d個の解が見つかりました。以下に表示します。\n",ansum);
printf("使用数:");
for (tr=0;tr<5;tr++) {
printf("%f ",array[tr]);
}
printf("目標数:%f\n",tothe);
for (tr=0;tr<ansum;tr++) {
printf(anser2[tr]);
printf("=");
printf("%f\n",ganser[tr]);
}
printf("\n※ √ は都合上 # に置き換わっています。\n");
printf("※ 同じ解がダブる可能性があります。\n");
printf("※ A-(B+C) や (A-B)-C や (A-C)-B などは違うものとみなされます。\n");
printf("※ ±0.0001以下の誤差は保証の限りではありません。\n");
}
printf("※ 解が存在する問題でも、桁数の都合上解けない場合があります。\n");
printf("\n\n======================================================\n\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment