/******************************************************************************
分治递归
首先从集合A中任意取出两个数,如取出1和2,A = A - {1, 2},对取出来的数分别进行
不同的四则运算,1+2=3,1-2=-1,1/2 = 0.5,1×2 = 2,将所得的结果再分别加入集合A,
可得到B = {3, 3, 4},C = {-1, 3, 4},D = {0.5, 3, 4},E = {2, 3, 4}四个新的集合,
那么f(A)= f(B)+ f(C)+ f(D)+ f(E),通过以上的计算就达到了分而治之的目的,
问题规模就从4个数降到了3个数,成了3个数的4个子问题之和。
综上所述,可以得到递归解法:
******************************************************************************/
#include
#include
#include
#include
#define PRECISION 0.000001
#define COUNT 4
#define RESULT 24
#define LENGTH 20
double number[COUNT]; //这里一定要用double,看看第一题的答案就知道为什么了
char *expression[COUNT]; //保存表达式
void combine(char *exp, char *exp1, char *exp2, char *op); //连接字符串
int test(int n);
void combine(char *exp, char *exp1, char *exp2, char *op)
{
strcpy(exp, "(");
strcat(exp, exp1);
strcat(exp, op);
strcat(exp, exp2);
strcat(exp, ")");
}
int test(int n)
{
int i, j;
double a, b;
char expa[LENGTH], expb[LENGTH];
if(n==1) //递归结束
{
if(fabs(number[0] - RESULT) < PRECISION)
{
printf("%s\n", expression[0]);
return 1;
}
else
return 0;
}
//递归过程
for(i=0; i
for(j=i+1; j
a = number[i];
b = number[j];
strcpy(expa, expression[i]);
strcpy(expb, expression[j]);
strcpy(expression[j], expression[n-1]);
combine(expression[i], expa, expb, "+");
number[i] = a + b;
number[j] = number[n-1]; //结果放到参加运算的第一个,最后一个放到参加运算的第二个
if(test(n-1) == 1)
return 1;
//减号有两种情况,a-b与b-a
combine(expression[i], expa, expb, "-");
number[i] = a - b;
if(test(n-1) == 1)
return 1;
combine(expression[i], expb, expa, "-");
number[i] = b - a;
if(test(n-1) == 1)
return 1;
combine(expression[i], expa, expb, "*");
number[i] = a * b;
if(test(n-1) == 1)
return 1;
//除法也有两种情况,a/b与b/a
if( b != 0 )
{
combine(expression[i], expa, expb, "/");
number[i] = a / b;
if(test(n-1) == 1)
return 1;
}
if( a!=0 )
{
combine(expression[i], expb, expa, "/");
number[i] = b / a;
if(test(n-1) == 1)
return 1;
}
//恢复数组
number[i] = a;
number[j] = b;
strcpy(expression[i], expa);
strcpy(expression[j], expb);
}
}
return 0;
}
void main()
{
int i;
int num;
char buffer[COUNT][LENGTH];
printf("请输入4个数:\n");
for(i=0; i
scanf("%d", &num);
number[i] = num;
_itoa(num, buffer[i], 10);
expression[i] = buffer[i];
}
if(test(COUNT) == 0)
printf("无解。\n");
}
#include
#include
using namespace std;
const int size=9;
class guess
{
public:
void randnum();
void cutnumguess(int);
void done();
bool guessn;
int a;
int b;
private:
int rslt[4];
int guessnum[4];
}game;
void guess::randnum()
{
rslt[0]=rand()%size;
do
rslt[1]=rand()%size;
while(rslt[1]==rslt[0]);
do
rslt[2]=rand()%size;
while(rslt[2]==rslt[0]||rslt[2]==rslt[1]);
do
rslt[3]=rand()%size;
while(rslt[3]==rslt[0]||rslt[3]==rslt[1]||rslt[3]==rslt[2]);
}
void guess::cutnumguess(int n)
{
guessnum[0]=n/1000;
guessnum[1]=n/100-10*guessnum[0];
guessnum[3]=n%10;
guessnum[2]=(n%100-guessnum[3])/10;
guessn=true;
int i,j;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{
if(guessnum[i]==guessnum[j])
{
guessn=false;
break;
}
if(guessn)
;
else
break;
}
}
void guess::done()
{
a=0;
b=0;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(i==j&&guessnum[i]==rslt[j])
a++;
if(i!=j&&guessnum[i]==rslt[j])
b++;
}
}
void main()
{
char gameexit;
int chance,n;
do
{
chance=10;
game.randnum();
do
{
cout<<"你还有"<
game.cutnumguess(n);
while(!game.guessn||n>9999||n<0)
{
cout<<"数字输入错误,请重新输入"<
cin>>n;
game.cutnumguess(n);
}
game.done();
if(game.a==4)
{
cout<<"你赢了!!!"<
break;
}
else
{
cout<
chance--;
}while(chance!=0);
if(chance==0)
{
cout<<"你输了!!!"<
}
}while(gameexit != 'x');
cout<<"感谢您的使用,再见!"<
我说···这个在MSDN里面有的