10,由系统给出正确答案
算法思路:当你希望获取更多的解或者更快的得到答案的话,就可以使用这个功能。我采用穷举的方法,让计算机列出参与运算的数字和符号的各种排列方式,并按照基本运算原则进行计算,最后详细分析了出现括号的各种情况,并以规定的格式进行输出。
新建一个Unit文件“UnitAnswer”,打开UnitAnswer.h,加入如下代码:
//---------------------------------------------------------------------------
#ifndef UnitAnswerH
#define UnitAnswerH
#include <vcl.h>
//穷举法列出参与运算的数字的各种排列方式
void CunShuZi(int num[]);
//回溯法输出各个可能的正确答案
void CunFuHao(int xuhao);
//根据序号返回对应的运算符
char FuHao(int i);
//计算当前四则运算表达式,并返回计算结果
int JiSuan(void);
//记录正确答案到文本文件中
void Print(int n);
//---------------------------------------------------------------------------
#endif
然后切换到UnitAnswer.cpp,实现上述自定义函数。
//---------------------------------------------------------------------------
#pragma hdrstop
#include "UnitAnswer.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
const int MAX = 4; //参与运算的数字和符号的数量
int shuZi[MAX]; //存储参与运算的数字
char suanFu[MAX]; //存储可能的运算符,共4个:+,-,*,/
int iFile; //文件句柄
String str(""); //用来存储各个正确答案
//---------------------------------------------------------------------------
//穷举法列出参与运算的数字的各种排列方式
void CunShuZi(int num[])
{
DeleteFile("answer.txt"); //销毁原来的文本文件,以便记录本题的正确答案
iFile = FileOpen("answer.txt", fmOpenReadWrite);
if (iFile == -1) //新建文件
iFile = FileCreate("answer.txt", fmOpenReadWrite);
int i, j, k;
for (i=0; i<MAX; i++)//穷举法列出参与运算数字的各种排列方式
{
shuZi[0] = num[i];
for (j=0; j<MAX; j++)
{
if (i != j)
{
shuZi[1] = num[j];
for (k=0; k<MAX; k++)
{
if (i != k && j != k)
{
shuZi[2] = num[k];
shuZi[3] = num[6-i-j-k];
CunFuHao(0);//存储运算符
}
}
}
}
}
//输出最后一个答案到对话框,若无解则对话框的内容为空白
MessageBox(NULL, str.c_str(), "答案", MB_OK);
//MessageBox(NULL, "无解", "答案", MB_OK);
FileClose(iFile);
}
//---------------------------------------------------------------------------
//回溯法输出各个可能的正确答案
void CunFuHao(int xuhao)
{
int i;
for (i=0; i<=3; i++)
{
suanFu[xuhao] = FuHao(i);
if (xuhao < 2)
{
CunFuHao(xuhao+1);
}
else
{
Print(JiSuan()); //记录当前正确答案
}
}
}
//---------------------------------------------------------------------------
//根据序号返回对应的运算符
char FuHao(int i)
{
switch(i)
{
case 0: return '+';
case 1: return '-';
case 2: return '*';
case 3: return '/';
}
}
//---------------------------------------------------------------------------
//计算当前四则运算表达式,并返回计算结果
int JiSuan(void)
{
int i;
int result, sum1, sum2;
int flag0, flag1, flag2;
//判断第一,二,三个运算符是否为乘除运算符
flag0 = (suanFu[0] == '*' || suanFu[0] == '/');
flag1 = (suanFu[1] == '*' || suanFu[1] == '/');
flag2 = (suanFu[2] == '*' || suanFu[2] == '/');
if (!flag0 && flag1 && !flag2)//型如(a+b)*(c+d)
{
if (suanFu[0] == '+')
sum1 = shuZi[0] + shuZi[1];
else
sum1 = shuZi[0] - shuZi[1];
if (suanFu[2] == '+')
sum2 = shuZi[2] + shuZi[3];
else
sum2 = shuZi[2] - shuZi[3];
if (suanFu[1] == '*')
result = sum1 * sum2;
else if (sum2 != 0 && sum1%sum2 == 0 )
result = sum1 / sum2; /*前后两个数必须能整除,且分母不为0*/
else /*否则返回值12345(表示无效)*/
result = 12345;
}
if (result == 24) //得到型如(a+b)*(c+d)的答案
return 1;
if (suanFu[0] == '*' && suanFu[1] == '/' && !flag2)//型如a*b/(c+d)
{
result = shuZi[0] * shuZi[1];
if (suanFu[2] == '+')
sum1 = shuZi[2] + shuZi[3];
else
sum1 = shuZi[2] - shuZi[3];
if (sum1 != 0 && result%sum1 == 0 )
result /= sum1; /*前后两个数必须能整除,且分母不为0*/
else /*否则返回值12345(表示无效)*/
result = 12345;
}
if (result == 24)//得到型如a*b/(c+d)的答案
return 2;
if (suanFu[0] == '/' && !flag1 && !flag2)//型如a/(b+c)+d
{
if (suanFu[1] == '+')
sum1 = shuZi[1] + shuZi[2];
else
sum1 = shuZi[1] - shuZi[2];
if (sum1 != 0 && shuZi[0]%sum1 == 0 )
result = shuZi[0] / sum1; /*前后两个数必须能整除,且分母不为0*/
else
goto A;
if (suanFu[2] == '+')
result += shuZi[3];
else if (suanFu[2] == '-')
result -= shuZi[3];
}
A:
if (result == 24) //得到型如a/(b+c)+d的答案
return 3;
if (flag0 && !flag1 && flag2)//型如a*b+c*d
{
if (suanFu[0] == '*')
sum1 = shuZi[0] * shuZi[1];
else if (shuZi[1] != 0 && shuZi[0]%shuZi[1] == 0 )
sum1 = shuZi[0] / shuZi[1]; /*前后两个数必须能整除,且分母不为0*/
else
goto B;
if (suanFu[2] == '*')
sum2 = shuZi[2] * shuZi[3];
else if (shuZi[3] != 0 && shuZi[2]%shuZi[3] == 0 )
sum2 = shuZi[2] / shuZi[3]; /*前后两个数必须能整除,且分母不为0*/
else
goto B;
if (suanFu[1] == '+')
result = sum1 + sum2;
else
result = sum1 - sum2;
}
B:
if (result == 24) //得到型如a*b+c*d的答案
return 4;
result = shuZi[0];
for (i=0; i<=2; i++)//其他形式
{
switch(suanFu[i])
{
case '+': result += shuZi[i+1]; break;
case '-': result -= shuZi[i+1]; break;
case '*': result *= shuZi[i+1]; break;
case '/': if (shuZi[i+1] != 0 && result%shuZi[i+1] == 0 )
result /= shuZi[i+1]; /*前后两个数必须能整除,且分母不为0*/
else /*否则返回值12345(表示无效)*/
result = 12345;
break;
}
}
if (result == 24) //得到其他形式的答案
return 5;
return 0; //无解
}
//---------------------------------------------------------------------------
//记录正确答案到文本文件中
void Print(int n)
{
if (n == 0) //无解则不记录,直接返回到CunFuHao函数
return;
str = " ";
int flag0, flag1, flag2;
//判断第一,二,三个运算符是否为乘除运算符
flag0 = (suanFu[0] == '*' || suanFu[0] == '/');
flag1 = (suanFu[1] == '*' || suanFu[1] == '/');
flag2 = (suanFu[2] == '*' || suanFu[2] == '/');
if (n == 1) //型如(a+b)*(c+d)
{
str += "(";
str += shuZi[0];
str += suanFu[0];
str += shuZi[1];
str += ")";
str += suanFu[1];
str += "(";
str += shuZi[2];
str += suanFu[2];
str += shuZi[3];
str += ")";
}
else if (n == 2) //型如a*b/(c+d)
{
str += shuZi[0];
str += "*";
str += shuZi[1];
str += "/";
str += "(";
str += shuZi[2];
str += suanFu[2];
str += shuZi[3];
str += ")";
}
else if (n == 3) //型如a/(b+c)+d
{
str += shuZi[0];
str += "/";
str += "(";
str += shuZi[1];
str += suanFu[1];
str += shuZi[2];
str += ")";
str += suanFu[2];
str += shuZi[3];
}
else if (n==5 && !flag0 && flag1) //型如(a+b)*c+d
{
str += "(";
str += shuZi[0];
str += suanFu[0];
str += shuZi[1];
str += ")";
str += suanFu[1];
str += shuZi[2];
str += suanFu[2];
str += shuZi[3];
}
else if (n==5 && !flag1 && flag2)//型如(a+b+c)*d
{
str += "(";
str += shuZi[0];
str += suanFu[0];
str += shuZi[1];
str += suanFu[1];
str += shuZi[2];
str += ")";
str += suanFu[2];
str += shuZi[3];
}
else //不带括号的情况
{
for (int i=0; i<=2; i++)
{
str += shuZi[i];
str += suanFu[i];
}
str += shuZi[3];
}
FileWrite(iFile, str.c_str(), str.Length());//记录正确答案
//MessageBox(NULL, str.c_str(), "答案", MB_OK);
}
结语:
至此,实现了我想要的功能。
为了让您更好的参看这个程序,我给出UnitMain.h的内容。
//---------------------------------------------------------------------------
#ifndef UnitMainH
#define UnitMainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TEdit *Edit1;
TImage *Image1;
TImage *Image2;
TImage *Image3;
TImage *Image4;
TLabel *Label5;
TTimer *Timer1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
private: // User declarations
int ColorData[4];
int SpendTime;
bool IsInputValide();
bool RightBracket(const String & str);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
goal00001111于
(全文完)
评论