洛谷P1689--方程求解_题解

/*

P1689 题解

字符串的使用+状态判断

*/

#include <cstdio>//头文件
#include <cstring>//头文件
char st[101];//st数组是一个字符类型的数组(可以用来存储字符串),接下来我们将用它来存储这个方程
int main()//主函数
{
    int a=-1,b=-1,flag=-1,js=-2,wz=-2;//定义变量,a表示这个方程当中的第一个已知数,而b则是表示这个方程当中的第二个已知数,flag表示的是当前已经读完了多少个已知数,当flag=-1时表示没有读入任何一个或者已经读入到了一个,而在flag=0的时候则表示当前读入到了第二个已知数,请想一想,为什么在flag=0的时候可以表示两种状态,js表示的是这个算式当中使用了加法运算(即js=-1时)还是减法运算(即flag=0时),wz表示的是这个位置数在什么位置,如果wz=-1,那么就表明这个未知数在最左边,否则,当wz=0时,就表明这个未知数在中间,如果这个未知数在最右边的话,那么就可以根据js、a和b求出答案(因为有了这两个已知数就可以解这个方程了)
    gets(st+1);//读入这个字符串(因为读入的方程可能会有空格),所以不能够用scanf,要用gets
    int len=strlen(st+1);//len是用来存这个字符串的长度的
    for(int i=1;i<=len;i++)//从1到len进行循环,即遍历这个字符串
    {
        if(st[i]==' ')//如果这一位是空格(因为空格时多余的,所以要直接地进入到下一位)
        {
            continue;//直接进行下一次的循环
        }
        if(st[i]>='0' && st[i]<='9')//如果这一位是数字
        {
            if(flag==-1)//如果这是这个方程中的第一个未知数
            {
                a=0;//先把这个数给清零
                while(1)//一直循环(即死循环)
                {
                    if(st[i]==' ')//如果这是一个多余的空格(因为在数字中间有可能有空格,所以要在这里也要加一个判断,例如:12 345这样)
                    {
                        i++;//那么就直接将i加1
                    }
                    else if(st[i]>='0' && st[i]<='9')//否则,如果这一位上是数字
                    {
                        a=a*10+st[i]-'0';//加上去(例如a=12,这一位上是'3',那么12乘以10之后就是120,再加上数字3,即'3'-'0',就可以的到123了)
                        i++;//继续去下一位
                    }
                    else//如果这一位上既不是空格又不是数字,那么就表示这个数字读入完了
                    {
                        break;//跳出这个循环
                    }
                }
                flag=0;//改变flag的值,表示第一个给出的数(即已知数)已经读入完了
            }
            else if(flag==0)//如果第一个数读入完了
            {
                b=0;//那么就去读入第尔个数,然后给b初始化为0
                while(1)//一直循环
                {
                    if(st[i]==' ')//去除掉多余的空格
                    {
                        i++;//继续去下一位
                    }
                    else if(st[i]>='0' && st[i]<='9')//如果这一位上是数字
                    {
                        b=b*10+st[i]-'0';//加上去
                        i++;//继续去这个字符串的下一位找
                    }
                    else//如果读入完了
                    {
                        break;//跳出这个循环
                    }
                }
            }
        }
        if(st[i]=='+')//如果这个方程中用到了加法运算
        {
            js=-1;//那么就改js的值为-1
        }
        else if(st[i]=='-')//否则如果这个方程中用到了减法运算
        {
            js=0;//否则就将js的值改为0
        }
        if(st[i]=='?')//如果这一位上是要求的未知数
        {
            if(a==-1 && b==-1)//如果这个未知数在左边
            {
                wz=-1;//那么就将wz的值改为-1
            }
            else if(a!=-1 && b==-1)//否则如果这个未知数在中间
            {
                wz=0;//那么就将wz的值改为0
            }
            else if(a!=-1 && b!=-1)//否则如果这个未知数在右边
            {
                if(js==-1)//如果在这个方程中用到了加法运算
                {
                    printf("%d",a+b);//输出答案
                }
                else if(js==0)//否则如果在这个方程中用到了减法运算
                {
                    printf("%d",b-a);//输出答案
                }
                return 0;//结束程序(因为已经把答案输出了)
            }
        }
    }
    if(wz==-1)//如果这个未知数在左边
    {
        if(js==-1)//如果在这个方程中用到了加法运算
        {
            printf("%d",b-a);//输出答案
        }
        else if(js==0)//否则如果在这个方程中用到了减法运算
        {
            printf("%d",a+b);//输出答案
        }
    }
    else if(wz==0)//否则如果这个未知数在中间
    {
        if(js==-1)//如果在这个方程中用到了加法运算
        {
            printf("%d",b-a);//输出答案
        }
        else if(js==0)//否则如果在这个方程中用到了减法运算
        {
            printf("%d",a-b);//输出答案
        }
    }
    return 0;//结束程序
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值