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语言的运算符号数组替代的主要内容,如果未能解决你的问题,请参考以下文章

C语言中随机产生四则运算符号

C语言一个符号问题!!

汇编有符号除法运算

C语言中奇妙又有趣的符号——运算符(操作符)!C语言运算(操作)符最全集合(建议收藏)

C语言里且和或是啥符号

C语言中,64位无符号整型如何进行开方运算?