zoj 2492 A DP Problem

本文介绍了一种将数学方程求解功能融入计算器课程设计的方法,通过使用栈数据结构处理输入的数学表达式,并实现了浮点数取整功能。详细解释了如何通过解析输入字符串来识别数字和变量,以及如何进行基本的算术运算和方程求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 嘿嘿,做课程设计,我写的是计算器,本来还愁界面该怎么弄,后来看到这道计算方程式就来了灵感,干脆就加一个这功能吧,呵呵。。。。我写的比这个还复杂些,这道题计算出结果后向下取整就行了(用floor(double x)函数,原型 double floor(double x)返回的是取整后的浮点数)。。。。。大笑

用到栈方面的知识,我在计算器里把功能扩展了,输入的数可以带小数点。。。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int temp;                       
int x1,x2;   //x1是所有x(全放在'='号左边)的系数和,x2是所有常数(全放在'='号右边)的和 
char s[1000],ch;
int isNumber(char x)//判断是不是数 
{
    if(x>='0'&&x<='9')
       return 1;
    else
      return 0;
}   
int toNumber()  //转化为数据 
{
    int y=0;
    while(isNumber(ch))
    {
        y+=ch-'0'; 
        ch=s[temp++];
        if(isNumber(ch))
            y*=10;
     }
     return y;
}   
void cacul()
{
    int len=strlen(s),t,pp=1,m=1;
    ch=s[temp];
    while(ch!='\0')
    {
       if(m==1)
       {
         ch=s[temp++];   
         if(isNumber(ch)||ch=='x') //处理第一个字符为'-'的情况 
         {
            ch='+';
            temp--;
         }
         m=2;
       }
       switch(ch)
       {
          case '+':{
                      ch=s[temp++];
                      if(ch=='x')  //x的系数为1 
                      {
                         if(pp==1)   
                            x1+=1;
                         else
                            x1-=1;   
                         ch=s[temp++];
                      }
                      else
                      {
                        if(isNumber(ch))
                        {
                            t=toNumber();
                            if(ch=='x')
                            {
                              if(pp==1)  
                                  x1+=t;
                              else
                                  x1-=t;
                              ch=s[temp++];
                            }    
                            else
                            {
                              if(pp==1)  
                                 x2-=t;
                               else
                                 x2+=t;
                            }   
                        } 
                     }     
                      break;
                    }
          case '-':{
                      ch=s[temp++];
                      if(ch=='x')
                      {
                         if(pp==1)   
                            x1-=1;
                         else
                            x1+=1;   
                         ch=s[temp++];
                      }
                      else
                      {
                        if(isNumber(ch))
                        {
                            t=toNumber();
                            if(ch=='x')
                            {
                              if(pp==1)  
                                  x1-=t;
                              else
                                  x1+=t;
                              ch=s[temp++];    
                            }    
                            else
                            {
                              if(pp==1)  
                                 x2+=t;
                               else
                                 x2-=t;
                            }
                        }   
                      }      
                      break;
                    }
          case '=':{
                      ch=s[temp++];
                      if(isNumber(ch)||ch=='x')
                      {
                        ch='+';
                        temp--;
                      }
                      pp=2;
                      break;
                    }
        }    
    }  
}   
int main()
{
   int ncase;
   double m;
   scanf("%d",&ncase);
   while(ncase--) 
   {
        scanf("%s",s);
        temp=0;
        x1=0;
        x2=0;
        cacul();
        if(x1==0)
        {
            if(x2==0)
               printf("IDENTITY\n");
            else
               printf("IMPOSSIBLE\n");
        }
        else
        {
            m=x2*1.0/x1; 
            printf("%d\n",(int)floor(m));
        }      
    }
   return 0;
}  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值