C语言:从0到9中任选四个数利用四则运算、及括号得到24。输出一种可能即可。

如题所述

给你个参考程序:
这个程序实现的是输入4 个数,如果这个四个数可以用四则运算、及括号得到24,那么输出这种运算。

输入
5 5 1 5
输出
5*(5-(1/5))

#include<stdio.h>
int flag;
double count(double a,double b,int op)
{
if(op==0)return a+b;
if(op==1)return a-b;
if(op==2)return a*b;
if(b==0){
flag=1;return 0;
}
return a/b;
}
int main()
{
int s,i,j,k;
double a,b,c,d,x,y,z;
char op[5]={"+-*/"};
while(~scanf("%lf%lf%lf%lf",&a,&b,&c,&d)){
s=1;
for(i=0;s&&i<4;i++){
for(j=0;s&&j<4;j++)
for(k=0;s&&k<4;k++){
while(s){
flag=0;
x=count(a,b,i);
if(flag)break;
y=count(x,c,j);
if(flag)break;
z=count(y,d,k);
if(flag)break;
if(z==24.0){
printf("((%.0f%c%.0f)%c%.0f)%c%.0f\n",a,op[i],b,op[j],c,op[k],d);
s=0;
}
break;
}
while(s){
flag=0;
x=count(a,b,i);
y=count(c,d,k);
if(flag)break;
z=count(x,y,j);
if(flag)break;
if(z==24.0){
printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",a,op[i],b,op[j],c,op[k],d);
s=0;
}
break;
}
while(s){
flag=0;
x=count(b,c,j);
if(flag)break;
y=count(a,x,i);
if(flag)break;
z=count(y,d,k);
if(flag)break;
if(z==24.0){
printf("(%.0f%c(%.0f%c%.0f))%c%.0f\n",a,op[i],b,op[j],c,op[k],d);
s=0;
}
break;
}
while(s){
flag=0;
x=count(b,c,j);
if(flag)break;
y=count(x,d,k);
if(flag)break;
z=count(a,y,i);
if(flag)break;
if(z==24.0){
printf("%.0f%c((%.0f%c%.0f)%c%.0f)\n",a,op[i],b,op[j],c,op[k],d);
s=0;
}
break;
}
while(s){
flag=0;
x=count(c,d,k);
if(flag)break;
y=count(b,x,j);
if(flag)break;
z=count(a,y,i);
if(flag)break;
if(z==24.0){
printf("%.0f%c(%.0f%c(%.0f%c%.0f))\n",a,op[i],b,op[j],c,op[k],d);
s=0;
}
break;
}
}
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-11
#include<iostream>
using namespace std;
class calculator
{
public:
char token;
int exp( void );
int term( void );
int factor( void );
void match( char expectedToken );
void error( void );
};
int calculator::exp(void)
{
int temp = term(); /*计算比加减运算优先级别高的部分*/
while (( token == '+' ) || ( token == '-' ))
switch ( token )
{
case '+':
match('+'); /*加法*/
temp += term();
break;
case '-':
match('-');
temp -= term(); /*减法*/
break;
}
return temp;
}
int calculator::term( void )
{
int div; /*除数*/
int temp = factor(); /*计算比乘除运算优先级别高的部分*/
while (( token == '*' ) || ( token == '/' ))
switch ( token )
{
case '*':
match('*'); /*乘法*/
temp *= factor();
break;
case '/':
match('/'); /*除法*/
div = factor();
if ( div == 0 ) /*需要判断除数是否为0*/
{
fprintf(stderr, "除数为0.\n" );
exit(1);
}
temp /= div;
break;
}
return temp;
}

int calculator::factor( void )
{
int temp;
if ( token == '(' ) /*带有括号的运算*/
{
match( '(' );
temp = exp();
match(')');
}

else if ( isalnum(token)) //实际的数字
{
ungetc( token, stdin ); //将读入的字符退还给输入流
scanf( "%d", &temp ); //读出数字
token = getchar(); //读出当前的标志
}
else error(); //不是括号也不是数字
return temp;
}

void calculator::match( char expectedToken ) //对当前的标志进行匹配
{
if ( token == expectedToken ) token = getchar(); //匹配成功,获取下一个标志
else error(); //匹配不成功,报告错误
}

void calculator::error( void ) //报告出错信息的函数
{
cout<< "输入有错误"<<endl;
exit( 1 );
}

int main ()
{
cout<<"================================================================\n";
cout<<"* 递归实现的四则运算表达式求值程序 *\n";
cout<<"****************************************************************\n";
cout<<"使用方法:请从键盘上直接输入表达式,以回车键结束.如45*(12-2)[回车]\n";
cout<<"*****************************************************************\n\n";
int result; //运算的结果
cout<<"请输入表达式: ";
calculator c1;
c1.token = getchar(); //载入第一个符号
result = c1.exp(); //进行计算
if ( c1.token == '\n' ) // 是否一行结束
cout<< " >> 表达式的计算结果为 : "<<result<<endl;
else c1.error(); //出现了例外的字符
return 0;
}

不过是C++的,差不多了。
直接输入算式就可以给出结果,在gcc3.4.5下编译通过,vc我没有试过
第2个回答  2011-06-09
算24点啊,搜索“24点算法”,很多的。
相似回答