c语言的运算符号数组替代
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言的运算符号数组替代相关的知识,希望对你有一定的参考价值。
我想用char f[4]='+','-','*','/';来表示加减乘除四个运算符号,因为下面我要将一组数据比如1,2,3,4进行所有可能的四则运算,求出所有可能的解,但是问题在于x[0],x[1],x[2],x[3]这4个数怎么与f[i]连接呢?如果直接是x[0]f[0]x[1]f[3]x[3]f[2]x[2]这样的话编译不会通过,因为计算机会把f[i]只当做字符,而不是运算符号,怎么破?
运算符号字符只是一个记号,最后由程序翻译就好了。我看楼主问题似乎和计算24点的问题有点相似,我正好写了一个,就是全搜索,计算所有可能的解,式子表现为一颗二叉树,叶子节点是数,其它节点代表运算符。代码如下,仅供参考:
#include <stdio.h>#include <string.h>
/*
* game to get 24, give n, four symbols ( + - * / )
* will max f(n) = 3**(n-1) * n! * (n-1)! values
* f(4) = 3888 f(5) = 233280
* f(6) = 20995200 f(7) = 2645395200
* so maybe 6 or 7 is the limited.
*/
#define LMX_ABS(a) ((a)<0?(-(a)):(a))
bool DblEqual_L(double a, double b)
return LMX_ABS(a-b) < 0.0000001;
#define MAXN 6
#define MAX_SAVE 128
int n = 4, aim = 24;
int v[MAXN] = 5, 3, 7, 8 ;
char symbols[8] = "+-_*/?";
struct Node
double val;
int syb;
struct Node *l, *r, *p;
;
Node node[(MAXN*2-1) * MAX_SAVE], curr[MAXN*2-1];
Node *root[MAX_SAVE];
bool used[MAXN*2-1];
int i_save, i_exist, i_base;
void DfsCopy_L(Node *q, Node *p)
if (p->l != NULL)
node[i_base].p = q;
node[i_base].val = p->l->val;
node[i_base].syb = p->l->syb;
q->l = &node[i_base];
i_base++;
node[i_base].p = q;
node[i_base].val = p->r->val;
node[i_base].syb = p->r->syb;
q->r = &node[i_base];
i_base++;
DfsCopy_L(q->l, p->l);
DfsCopy_L(q->r, p->r);
void Save_L(Node *p)
i_base = i_save*(MAXN*2-1);
root[i_save] = &node[i_base];
Node *q = root[i_save];
q->val = p->val;
q->syb = p->syb;
i_base++;
DfsCopy_L(q, p);
i_save++;
void Print_L(Node *p)
if (p->syb < 0) printf("%d", (int)(p->val+0.0001));
else if (p->syb == 2 || p->syb == 5)
printf("( ");
Print_L(p->r);
printf(" %c ", symbols[p->syb-1]);
Print_L(p->l);
printf(" )");
else
printf("( ");
Print_L(p->l);
printf(" %c ", symbols[p->syb]);
Print_L(p->r);
printf(" )");
double Cal_L(double a, double b, int k)
double r;
switch (k)
case 0: r = a+b; break;
case 1: r = a-b; break;
case 2: r = b-a; break;
case 3: r = a*b; break;
case 4: r = a/b; break;
case 5: r = b/a; break;
default: r = 1.0; break;
return r;
void go(int step)
if (step == 2*n-1)
int i = 2*n-2;
if (DblEqual_L(curr[i].val, aim))
i_exist++;
if (i_save < MAX_SAVE)
Save_L(&curr[i]);
Print_L(&curr[i]);
printf("\\n");
return;
int i, j, k;
for (i = 0; i < step-1; i++)
if (used[i])
for (j = i+1; j < step; j++)
if (used[j])
used[i] = false;
used[j] = false;
used[step] = true;
curr[step].l = &curr[i];
curr[step].r = &curr[j];
curr[i].p = &curr[step];
curr[j].p = &curr[step];
for (k = 0; k < 6; k++)
curr[step].syb = k;
curr[step].val = Cal_L(curr[i].val, curr[j].val, k);
go(step+1);
used[i] = true;
used[j] = true;
used[step] = false;
int main( int argc, char *argv[] )
int i;
for (i = 0; i < n; i++)
curr[i].val = v[i];
curr[i].syb = -1;
used[i] = true;
go(n);
return 0;
参考技术A 先按照你的思路走,接下来再另想捷径!
最直接的办法是在些一个运算识别子函数,即把一串字符串识别为运算式,比如“1+2+3/4”这个字符串识别为1+2+3/4这个运算式。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/***********************************************/
//float calc( char s[] ) 用于计算字符串表达式
//s为要计算的表达式,结果返回到函数
//输入要求:要计算的数为整数,运算符暂时只支持+ - * /
//例如:输入 8*7-6-4 answer=46.0000
/***********************************************/
float calc(char s[])
float num[50],temp,temp1,answer;//num用于存储表达式提取到的每一个数字,answer为结果
unsigned int opera=0;//从低位开始依次记录输入运算式的+、-号,其某位为1时表示+,否则为-
unsigned char i=0,j=0,j1=0;//i用于依次读取s字符每一位,j记录有几个+或-号
unsigned char flag=0;//用于记录是除号(为2)还是乘(1),都不是则为0
//puts(s);
for(temp=0,temp1=0;;i++)
if(s[i]>='0'&&s[i]<='9')//存储从字符串得到的数字
if(flag)temp1=temp1*10+s[i]-'0';
else temp=temp*10+s[i]-'0';
else
if(s[i]=='*')flag=1;temp1=0;
else if(s[i]=='/')flag=2;temp1=0;
else
if(flag==1)num[j]=temp*temp1; else if(flag==2)num[j]=temp/temp1; else num[j]=temp;
flag=0;
//printf("****%f %f***\n",temp,temp1);
if(s[i]=='+')
opera |=(1<<j);
// printf("-%d--%d--\n",j,opera);
//end
if(s[i]=='\0')
answer=num[0];
//printf("---%d--\n",opera);
do
if((opera&(1<<j1)))
answer+=num[j1+1];
else
answer=answer-num[j1+1];
//printf("%f---%d--%f\n",answer,opera,num[j1+1]);
j1++;
while(j1<j);
return answer;
j++;temp=0;temp1=0;
void main()
char str1[100];
float answer;
printf("## 请输入要计算的表达式,允许的运算符为+ - * / \n## 且计算的数字要求为整数\n");
S1:
scanf("%s",str1);//输入要计算式子
answer=calc(str1);
printf("\nanswer=%f\n",answer);
printf("@@ 若要再次运算请再输入:\n");
goto S1;
参考技术B 你是不是做24点的程序,这个程序你看看
#include "stdio.h"
typedef float (__cdecl *TYPE_MYFUN)(float , float );
float FunAdd(float x, float y)
return x+y;
float FunSub(float x, float y)
return x-y;
float FunMul(float x, float y)
return x*y;
float FunDiv(float x, float y)
return x/y;
bool operatorFun(float a, float b, float c, float d);
int main(int argc, char* argv[])
float Num[4] = 0;
bool bFit=false;
scanf("%f %f %f %f" ,Num , Num+1,Num+2,Num+3 );
for( int a = 0 ; a < 4; a++ )
for( int b = 0 ; b < 4; b++ )
if(b == a)continue;
if(Num[b] == Num[a] && b < a)continue;
for( int c = 0 ; c < 4; c++ )
if(c == a || c == b)continue;
if(Num[c] == Num[a] && c < a || Num[c] == Num[b] && c < b)continue;
for( int d = 0 ; d < 4; d++ )
if(d == a || d == b || d == c)continue;
if(Num[d] == Num[a] && d < a || Num[d] == Num[b] && d < b || Num[d] == Num[c] && d < c)continue;
bFit |= operatorFun(Num[a],Num[b],Num[c],Num[d]);
if(!bFit)
printf("No Fitting!\\n");
return 0;
bool operatorFun( float a, float b ,float c ,float d)
static TYPE_MYFUN Fun[4] = FunAdd ,FunSub , FunMul , FunDiv ;
static char op[4] = '+' , '-' , '*' ,'/';
bool bRet=false;
for( int x = 0 ; x < 4 ; x++ )
for( int y = 0 ; y < 4 ; y++ )
for( int z = 0 ; z < 4 ; z++ )
float sum = Fun[z]( Fun[y]( Fun[x](a,b) ,c) ,d);
if( (sum >23.9)&&(sum<24.1) )
printf("((%d%c%d)%c%d)%c%d\\n",(int)a,op[x] ,(int)b,op[y] ,(int)c,op[z],(int)d);
bRet=true;
sum = Fun[z]( Fun[x](a,b) , Fun[y](c ,d) );
if( (sum >23.9)&&(sum<24.1) )
printf("(%d%c%d)%c(%d%c%d)\\n",(int)a,op[x] ,(int)b,op[z] ,(int)c,op[y],(int)d);
bRet=true;
sum = Fun[z]( a , Fun[y](b , Fun[x](c,d) ) );
if( (sum >23.9)&&(sum<24.1) )
printf("%d%c(%d%c(%d%c%d))\\n",(int)a,op[z] ,(int)b,op[y] ,(int)c,op[x],(int)d);
bRet=true;
return bRet;
参考技术C 当然通不过,C语言没有那么高级。
你只能通过自己的if或者switch来判断这个是什么符号。
就算得到了这个符号,你还是得自己来判断运算的优先级,每次只能算两个数的运算。 参考技术D 先把两个数运算搞定,对下面的c循环即可:
fun_ope(double a, double b, int c)
if (c==0)
return a+b;
else if (c==1)
return a-b;
else if (c==2)
return a*b;
else if (c==3)
return a/b;
else if (c==4)
return b-a;
else
return b/a;
然后,4个数一共有12种顺序,对这12种顺序,再循环一下就可以了本回答被提问者采纳
以上是关于c语言的运算符号数组替代的主要内容,如果未能解决你的问题,请参考以下文章