主题:24点问题
小露
[专家分:20] 发布于 2004-03-27 22:31:00
不知道你玩过24点吗?就是任意给你4个数字,你用+,-,*,/运算符去得到24。
有兴趣的试试看呢,我是没思考出来,高手来指教!
回复列表 (共17个回复)
11 楼
紫忆 [专家分:2480] 发布于 2005-01-31 12:50:00
sprintf(cx[i],"%d",(int)num[i]);请问楼主为什么要把书转化成int我认为没必要~~~~本人初学者,希望楼主指教~~
12 楼
caoxin [专家分:1540] 发布于 2005-01-31 15:16:00
#include<iostream.h>
#include<stdlib.h>
float a[4]={0},sum=0.0;
float opertar(int a,int b,int c)
{switch(a)
{case 0:sum=a[i]+a[j];break;
case 1:sum=a[i]-a[j];break;
case 2:sum=a[i]*a[j];break;
case 3:sum=a[i]/a[j];break;}
switch(b)
{case 0:sum=sum+a[k];break;
case 1:sum=sum-a[k];break;
case 2:sum=sum*a[k];break;
case 3:sum=sum/a[k];break;}
switch(c)
{case 0:sum=sum+a[m];break;
case 1:sum=sum-a[m];break;
case 2:sum=sum*a[m];break;
case 3:sum=sum/a[m];break;}
return sum;}
void main()
{int i,j,k,m;
srand(_TIME_);
for(i=0;i<4;i++) a[i]=rand()+1; //产生四个大于零的随机数
for(i=0;i<4;i++)
for(j=0;j<4;i++)
for(k=0;k<4;i++)
for(m=0;m<4;i++){
(i==j)||(i==k)||(i==m)||(j==k)||(j==m)||(k==m)?continue:
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
opertar(i,j,k)==24.0?cout<<a[i], i==0?cout<<"+":i==1?cout<<"-":i==2?cout<<"*":i==3?cout<<"/",cout<<a[j], j==0?cout<<"+":j==1?cout<<"-":j==2?cout<<"*":j==3?cout<<"/",cout<<a[k], k==0?cout<<"+":k==1?cout<<"-":k==2?cout<<"*":k==3?cout<<"/",cout<<a[m]<<"=24",break;
}}
13 楼
cbjszy [专家分:0] 发布于 2005-02-05 08:29:00
zzz
14 楼
goal00001111 [专家分:4030] 发布于 2005-03-13 10:19:00
我的程序虽然长了点,可是他可以输出所有可能的排列,而且去掉了部分多余的括号,大家有兴趣的侃侃!
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
void Print(char exp[], int len, FILE *fp);/*输出表达式,并存储在文件中*/
int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/
int JiSuan(char exp[]); /*求逆波兰表达式的值*/
int main(void)
{
char *pstr, str[MAX];/*存储原算术表达式*/
char *pexp, exp[MAX];/*存储转化成的逆波兰表达式*/
char fuhao[4]={'+','-','*','/'};/*存储运算符号*/
char leftch[2]={' ','('};/*存储左括号*/
char rightch[2]={' ',')'}; /*存储右括号*/
int num[4];
int xuhao[12]={0};
int result; /*存储逆波兰表达式的值*/
int len, i, j, k;
int sum1, sum2, l1, l2, l3, l4, r1, r2, r3, r4;
FILE *fp;
pstr=str;
pexp=exp;
if ( (fp=fopen("cccc.txt","w+")) == NULL)
{
fprintf(stderr,"\nError opening file .\n");
exit(1);
}
for(int i=0; i<4; i++)
{
fprintf(stdout, "请从0-9中选择一个数字输入:");
scanf("%d",&num[i]);
}
for(int i=0; i<4; i++)
{
fprintf(fp, "num[%d]=%d\t", i, num[i]);
fprintf(stdout, "num[%d]=%d\t", i, num[i]);
}
fprintf(fp, "\n");
fprintf(stdout, "\n");
system("pause");
15 楼
goal00001111 [专家分:4030] 发布于 2005-03-13 10:23:00
接主程序部分:
for(xuhao[0]=0; xuhao[0]<2; xuhao[0]++)/*用穷举法列出所有可能的算式*/
{
str[0]=leftch[xuhao[0]]; /*为提高效率,先列出左右括号存在的可能情况,最多有3个左括号3个右括号*/
if(str[0] == '(')/*判断第一个左括号是否存在*/
l1=1;
else
l1=0;
for(xuhao[1]=0; xuhao[1]<2; xuhao[1]++)
{
str[3]=leftch[xuhao[1]];
if(str[3] == '(')/*判断第二个左括号是否存在*/
l2=1;
else
l2=0;
for(xuhao[2]=0; xuhao[2]<2; xuhao[2]++)
{
str[7]=leftch[xuhao[2]];
if(str[7] == '(')/*判断第三个左括号是否存在*/
l3=1;
else
l3=0;
for(xuhao[3]=0; xuhao[3]<2; xuhao[3]++)
{
str[5]=rightch[xuhao[3]];
if(str[5] == ')')/*判断第一个右括号是否存在*/
r1=1;
else
r1=0;
for(xuhao[4]=0; xuhao[4]<2; xuhao[4]++)
{
str[9]=rightch[xuhao[4]];
if(str[9] == ')')/*判断第二个右括号是否存在*/
r2=1;
else
r2=0;
for(xuhao[5]=0; xuhao[5]<2; xuhao[5]++)
{
str[12]=rightch[xuhao[5]];
if(str[12] == ')')/*判断第三个右括号是否存在*/
r3=1;
else
r3=0;
sum1=l1+l2+l3;/*计算左括号的总的个数*/
sum2=r1+r2+r3;/*计算右括号的总的个数*/
if(sum1 == sum2)/*只有左括号的个数等于括号的个数时才进行计算*/
for(xuhao[6]=0; xuhao[6]<4; xuhao[6]++)/*列出每个运算符号的可能情况*/
{
str[2]=fuhao[xuhao[6]];
for(xuhao[7]=0; xuhao[7]<4; xuhao[7]++)
{
str[6]=fuhao[xuhao[7]];
for(xuhao[8]=0; xuhao[8]<4; xuhao[8]++)
{
str[10]=fuhao[xuhao[8]];
for(i=0; i<4; i++)/*列出每个数字可能出现的排列情况*/
{
str[1]=(char)(num[i]+48);
for(j=0; j<4; j++)
if(i != j)
{
str[4]=(char)(num[j]+48);
for(k=0; k<4; k++)
if(i != k && j != k)
{
str[8]=(char)(num[k]+48);
str[11]=(char)(num[6-i-j-k]+48);
str[13]='#';
len=Change(pstr, pexp);/*将一般表达式转化为逆波兰表达式*/
if(-1 == len)/*根据len的返回值决定是否进行计算,-1 == len表示出现错误*/
;
else
{
result=JiSuan(pexp);/*根据result的返回值决定是否进行输出*/
if(12345 == result)/*12345 == result表示出现错误*/
;
else if( 24 == result)
{
if(str[3] == '(' && str[5] == ')'
|| str[7] == '(' && str[9] == ')')/*去掉多余的括号,如(4)*/
;
else
{
fprintf(fp, "正确的算术表达式: ");
fprintf(stdout, "正确的算术表达式: ");
Print(pstr, 14, fp);/*输出正确的算术表达式,并存储在文件中*/
}}}}}}}}}}}}}}}
fclose(fp);
system("pause");
return 0;
}
16 楼
goal00001111 [专家分:4030] 发布于 2005-03-13 10:24:00
以下是子程序:
void Print(char exp[], int len, FILE *fp)
{
int i;
for(i=0; i<len; i++)
{
fprintf(fp, "%c", exp[i]);
fprintf(stdout, "%c", exp[i]);
}
printf("\n");
}
int Change(char str[], char exp[])
{
int i, t, top;/*t作为exp的下标,top作为stack的下标,i作为str的下标*/
char stack[MAX], ch;/*作为饯使用*/
t=0;
i=0;
top=0;
stack[0]='#';
ch=str[i++];
while(ch != '#')
{
if(ch >= '0' && ch <= '9')
exp[t++]=ch;
else if(ch == '(')
stack[++top]=ch;
else if(ch == ')')
{
while(stack[top] != '(' && top > 0)
exp[t++]=stack[top--];
if(top == 0)/*表示没有对应的 ')'*/
return -1;
top--;
}
else if(ch == '+' || ch == '-')
{
while(top != 0 && stack[top] != '(')
exp[t++]=stack[top--];
stack[++top]=ch;
}
else if(ch == '*' || ch == '/')
{
while(stack[top] == '*' || stack[top] == '/')
exp[t++]=stack[top--];
stack[++top]=ch;
}
ch=str[i++];
}
while(top != 0)
{
if('(' == stack[top])/*表示有多余的 '(' */
return -1;
else
exp[t++]=stack[top--];
}
exp[t]='#';
return t+1;
}
int JiSuan(char exp[])
{
int stack[MAX], d;/*作为饯使用*/
char c;
int i=0, t=0, top=0;
c=exp[t++];
while(c != '#')
{
d=c-'0';
if(c >= '0' && c <= '9')
stack[top++]=d;
else
{
switch(c)
{
case '+': stack[top-2]=stack[top-2]+stack[top-1];
break;
case '-': stack[top-2]=stack[top-2]-stack[top-1];
break;
case '*': stack[top-2]=stack[top-2]*stack[top-1];
break;
case '/': if(stack[top-1] != 0 && stack[top-2]%stack[top-1] == 0 )
stack[top-2]=stack[top-2]/stack[top-1];/*前后两个数必须能整除,且分母不为0*/
else /*否则返回值12345(表示无效)*/
return 12345;
break;
}
top--;
}
c=exp[t++];
}
return stack[top-1];
}
17 楼
goal00001111 [专家分:4030] 发布于 2005-03-13 10:26:00
num[0]=1 num[1]=3 num[2]=5 num[3]=9
正确的算术表达式: 9+ 1 * 3 *5 #正确的算术表达式: 9+ 1 * 5 *3 #正确的算术表达式: 9+ 3 * 1 *5 #正确的算术表达式: 9+ 3 * 5 *1 #正确的算术表达式: 9+ 5 * 1 *3 #正确的算术表达式: 9+ 5 * 3 *1 #正确的算术表达式: 9+ 3 * 5 /1 #正确的算术表达式: 9+ 5 * 3 /1 #正确的算术表达式: 9+ 3 / 1 *5 #正确的算术表达式: 9+ 5 / 1 *3 #正确的算术表达式: 1* 9 + 3 *5 #正确的算术表达式: 1* 9 + 5 *3 #正确的算术表达式: 3* 5 + 1 *9 #正确的算术表达式: 3* 5 + 9 *1 #正确的算术表达式: 5* 3 + 1 *9 #正确的算术表达式: 5* 3 + 9 *1 #正确的算术表达式: 9* 1 + 3 *5 #正确的算术表达式: 9* 1 + 5 *3 #正确的算术表达式: 3* 5 + 9 /1 #正确的算术表达式: 5* 3 + 9 /1 #正确的算术表达式: 1* 3 * 5 +9 #正确的算术表达式: 1* 5 * 3 +9 #正确的算术表达式: 3* 1 * 5 +9 #正确的算术表达式: 3* 5 * 1 +9 #正确的算术表达式: 5* 1 * 3 +9 #正确的算术表达式: 5* 3 * 1 +9 #正确的算术表达式: 3* 5 / 1 +9 #正确的算术表达式: 5* 3 / 1 +9 #正确的算术表达式: 9/ 1 + 3 *5 #正确的算术表达式: 9/ 1 + 5 *3 #正确的算术表达式: 3/ 1 * 5 +9 #正确的算术表达式: 5/ 1 * 3 +9 #正确的算术表达式: 9+ 1 *(3 *5)#正确的算术表达式: 9+ 1 *(5 *3)#正确的算术表达式: 9+ 3 *(1 *5)#正确的算术表达式: 9+ 3 *(5 *1)#正确的算术表达式: 9+ 5 *(1 *3)#正确的算术表达式: 9+ 5 *(3 *1)#正确的算术表达式: 9+ 3 *(5 /1)#正确的算术表达式: 9+ 5 *(3 /1)#正确的算术表达式: 1* 9 +(3 *5)#正确的算术表达式: 1* 9 +(5 *3)#正确的算术表达式: 3* 5 +(1 *9)#正确的算术表达式: 3* 5 +(9 *1)#正确的算术表达式: 5* 3 +(1 *9)#正确的算术表达式: 5* 3 +(9 *1)#正确的算术表达式: 9* 1 +(3 *5)#正确的算术表达式: 9* 1 +(5 *3)#正确的算术表达式: 3* 5 +(9 /1)#正确的算术表达式: 5* 3 +(9 /1)#正确的算术表达式: 9/ 1 +(3 *5)#正确的算术表达式: 9/ 1 +(5 *3)#正确的算术表达式: 9+(1 * 3 *5)#正确的算术表达式: 9+(1 * 5 *3)#正确的算术表达式: 9+(3 * 1 *5)#正确的算术表达式: 9+(3 * 5 *1)#正确的算术表达式: 9+(5 * 1 *3)#正确的算术表达式: 9+(5 * 3 *1)#正确的算术表达式: 9+(3 * 5 /1)#正确的算术表达式: 9+(5 * 3 /1)#正确的算术表达式: 9+(3 / 1 *5)#正确的算术表达式: 9+(5 / 1 *3)#正确的算术表达式: 1*(9 + 3 *5)#正确的算术表达式: 1*(9 + 5 *3)#正确的算术表达式: 1*(3 * 5 +9)#正确的算术表达式: 1*(5 * 3 +9)#正确的算术表达式: 9+(1 * 3)*5 #正确的算术表达式: 9+(1 * 5)*3 #正确的算术表达式: 9+(3 * 1)*5 #正确的算术表达式: 9+(3 * 5)*1 #正确的算术表达式: 9+(5 * 1)*3 #正确的算术表达式: 9+(5 * 3)*1 #正确的算术表达式: 9+(3 * 5)/1 #正确的算术表达式: 9+(5 * 3)/1 #正确的算术表达式: 9+(3 / 1)*5 #正确的算术表达式: 9+(5 / 1)*3 #正确的算术表达式: 1*(3 * 5)+9 #正确的算术表达式: 1*(5 * 3)+9 #正确的算术表达式: 3*(1 * 5)+9 #正确的算术表达式: 3*(5 * 1)+9 #正确的算术表达式: 5*(1 * 3)+9 #正确的算术表达式: 5*(3 * 1)+9 #正确的算术表达式: 3*(5 / 1)+9 #正确的算术表达式: 5*(3 / 1)+9 #正确的算术表达式: (9+ 1 * 3 *5)#正确的算术表达式: (9+ 1 * 5 *3)#正确的算术表达式: (9+ 3 * 1 *5)#正确的算术表达式: (9+ 3 * 5 *1)#正确的算术表达式: (9+ 5 * 1 *3)#正确的算术表达式: (9+ 5 * 3 *1)#正确的算术表达式: (9+ 3 * 5 /1)#正确的算术表达式: (9+ 5 * 3 /1)#正确的算术表达式: (9+ 3 / 1 *5)#正确的算术表达式: (9+ 5 / 1 *3)#正确的算术表达式: (1* 9 + 3 *5)#正确的算术表达式: (1* 9 + 5 *3)#正确的算术表达式: (3* 5 + 1 *9)#正确的算术表达式: (3* 5 + 9 *1)#正确的算术表达式: (5* 3 + 1 *9)#正确的算术表达式: (5* 3 + 9 *1)#正确的算术表达式: (9* 1 + 3 *5)#正确的算术表达式: (9* 1 + 5 *3)#正确的算术表达式: (3* 5 + 9 /1)#正确的算术表达式: (5* 3 + 9 /1)#正确的算术表达式: (1* 3 * 5 +9)#正确的算术表达式: (1* 5 * 3 +9)#正确的算术表达式: (3* 1 * 5 +9)#正确的算术表达式: (3* 5 * 1 +9)#正确的算术表达式: (5* 1 * 3 +9)#正确的算术表达式: (5* 3 * 1 +9)#正确的算术表达式: (3* 5 / 1 +9)#正确的算术表达式: (5* 3 / 1 +9)#正确的算术表达式: (9/ 1 + 3 *5)#正确的算术表达式: (9/ 1 + 5 *3)#正确的算术表达式: (3/ 1 * 5 +9)#正确的算术表达式: (5/ 1 * 3 +9)#正确的算术表达式: (9+ 3 * 5)*1 #正确的算术表达式: (9+ 5 * 3)*1 #正确的算术表达式: (9+ 3 * 5)/1 #正确的算术表达式: (9+ 5 * 3)/1 #正确的算术表达式: (3* 5 + 9)*1 #正确的算术表达式: (5* 3 + 9)*1 #正确的算术表达式: (3* 5 + 9)/1 #正确的算术表达式: (5* 3 + 9)/1 #正确的算术表达式: (1* 3 * 5)+9 #正确的算术表达式: (1* 5 * 3)+9 #正确的算术表达式: (3* 1 * 5)+9 #正确的算术表达式: (3* 5 * 1)+9 #正确的算术表达式: (5* 1 * 3)+9 #正确的算术表达式: (5* 3 * 1)+9 #正确的算术表达式: (3* 5 / 1)+9 #正确的算术表达式: (5* 3 / 1)+9 #正确的算术表达式: (3/ 1 * 5)+9 #正确的算术表达式: (5/ 1 * 3)+9 #正确的算术表达式: (1* 9)+ 3 *5 #正确的算术表达式: (1* 9)+ 5 *3 #正确的算术表达式: (3* 5)+ 1 *9 #正确的算术表达式: (3* 5)+ 9 *1 #正确的算术表达式: (5* 3)+ 1 *9 #正确的算术表达式: (5* 3)+ 9 *1 #正确的算术表达式: (9* 1)+ 3 *5 #正确的算术表达式: (9* 1)+ 5 *3 #正确的算术表达式: (3* 5)+ 9 /1 #正确的算术表达式: (5* 3)+ 9 /1 #正确的算术表达式: (1* 3)* 5 +9 #正确的算术表达式: (1* 5)* 3 +9 #正确的算术表达式: (3* 1)* 5 +9 #正确的算术表达式: (3* 5)* 1 +9 #正确的算术表达式: (5* 1)* 3 +9 #正确的算术表达式: (5* 3)* 1 +9 #正确的算术表达式: (3* 5)/ 1 +9 #正确的算术表达式: (5* 3)/ 1 +9 #正确的算术表达式: (9/ 1)+ 3 *5 #正确的算术表达式: (9/ 1)+ 5 *3 #正确的算术表达式: (3/ 1)* 5 +9 #正确的算术表达式: (5/ 1)* 3 +9 #正确的算术表达式: (1- 5)*(3 -9)#正确的算术表达式: (3- 9)*(1 -5)#正确的算术表达式: (5- 1)*(9 -3)#正确的算术表达式: (9- 3)*(5 -1)#正确的算术表达式: (1* 9)+(3 *5)#正确的算术表达式: (1* 9)+(5 *3)#正确的算术表达式: (3* 5)+(1 *9)#正确的算术表达式: (3* 5)+(9 *1)#正确的算术表达式: (5* 3)+(1 *9)#正确的算术表达式: (5* 3)+(9 *1)#正确的算术表达式: (9* 1)+(3 *5)#正确的算术表达式: (9* 1)+(5 *3)#正确的算术表达式: (3* 5)+(9 /1)#正确的算术表达式: (5* 3)+(9 /1)#正确的算术表达式: (9/ 1)+(3 *5)#正确的算术表达式: (9/ 1)+(5 *3)#正确的算术表达式: (9+(1 * 3)*5)#正确的算术表达式: (9+(1 * 5)*3)#正确的算术表达式: (9+(3 * 1)*5)#正确的算术表达式: (9+(3 * 5)*1)#正确的算术表达式: (9+(5 * 1)*3)#正确的算术表达式: (9+(5 * 3)*1)#正确的算术表达式: (9+(3 * 5)/1)#正确的算术表达式: (9+(5 * 3)/1)#正确的算术表达式: (9+(3 / 1)*5)#正确的算术表达式: (9+(5 / 1)*3)#正确的算术表达式: (1*(3 * 5)+9)#正确的算术表达式: (1*(5 * 3)+9)#正确的算术表达式: (3*(1 * 5)+9)#正确的算术表达式: (3*(5 * 1)+9)#正确的算术表达式: (5*(1 * 3)+9)#正确的算术表达式: (5*(3 * 1)+9)#正确的算术表达式: (3*(5 / 1)+9)#正确的算术表达式: (5*(3 / 1)+9)#
我来回复