hdu 1237简易计算器

思路是用递归~~ 比如1+3+4*7+3 先计算1+3   4+4*7+3 再  4+28+3 再 32+3 再35 ~~具体见代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void compute(double *dig,char *sign,int s1,int s2)
{
    double temp1,temp2;
    if(sign[s2]=='*')
    {
        s1++;
        dig[s1]=dig[s1]*dig[s1-1];
        s2++;
        if(sign[s2]!='\0')
            compute(dig,sign,s1,s2);
    }
    else if(sign[s2]=='/')
    {
        s1++;
        dig[s1]=dig[s1-1]/dig[s1];
        s2++;
        if(sign[s2]!='\0')
            compute(dig,sign,s1,s2);
    }
    else if(sign[s2]=='+')
    {
        if(sign[s2+1]=='+'||sign[s2+1]=='-')
        {
            s1++;
            dig[s1]=dig[s1]+dig[s1-1];
            s2++;
            if(sign[s2]!='\0')
                compute(dig,sign,s1,s2);
        }
        else
        {
            int i;
            temp1=dig[s1];
            temp2=dig[s1+1];
            int k=s1+2;   //存计算的;
            for(i=s2+1;sign[i]!='\0'&&(sign[i]=='*'||sign[i]=='/');i++)
            {
                if(sign[i]=='*')
                    temp2=temp2*dig[k++];
                else
                    temp2=temp2/dig[k++];
            }
            dig[k-1]=temp2+temp1;
            if(sign[i]!='\0')
                compute(dig,sign,k-1,i);
        }
    }
    else if(sign[s2]=='-')
    {
        if(sign[s2+1]=='+'||sign[s2+1]=='-')
        {
            s1++;
            dig[s1]=dig[s1-1]-dig[s1];
            s2++;
            if(sign[s2]!='\0')
            compute(dig,sign,s1,s2);
        }
        else
        {
            int i;
            temp1=dig[s1];
            temp2=dig[s1+1];
            int k=s1+2;   //存计算的;
            for(i=s2+1;sign[i]!='\0'&&(sign[i]=='*'||sign[i]=='/');i++)
            {
                if(sign[i]=='*')
                    temp2=temp2*dig[k++];
                else
                    temp2=temp2/dig[k++];
            }
            dig[k-1]=temp1-temp2;
            if(sign[i]!='\0')
                compute(dig,sign,k-1,i);
        }
    }
}
int main()
{
    char st[250];  //储存字符串;
    double dig[250];  //储存数字;
    char sign[250];  //储存符号;
    int i,j,k,l;   //  l储存字符串长度,J记dig k记sign;
    while(gets(st))
    {
        if(st[0]=='0'&&st[1]=='\0')
            break;
        memset(dig,0,sizeof(dig));
        i=j=k=0;
        l=strlen(st);
        for(i=0;i<l;i++)
        {
            while(st[i]>='0'&&st[i]<='9')
            {
                dig[j]=dig[j]*10+st[i]-'0';
                i++;
            }
            if(st[i]==' ')
                continue;
            j++;
            if(st[i]=='+'||st[i]=='-'||st[i]=='*'||st[i]=='/')
                sign[k++]=st[i];
        }
        sign[k]='\0';  //便于符号运算;
        compute(dig,sign,0,0);
        printf("%.2f\n",dig[j-1]);
    }
    return 0;
}

貌似还有一种思路,用树的遍历做 好像~~改天看看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值