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

来源:互联网 发布:西班牙海鲜饭 知乎 编辑:程序博客网 时间:2024/05/29 15:48

/*

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;//结束程序}
原创粉丝点击