带空格的等式
Time limit: 1000MS Memory limit: 32768K
Description:
给你一个等式,格式如“A = B”,请判断该等式左右两边表达式是否相等。
保证A、B为合法表达式,且表达式中只包含数字、空格,"+","-"。
注意:数字与运算符之间可能会出现若干空格,但数字中不会有空格。
Input:
首先输入一个数T,表示有T组case。每组case一行。
每组case给出一个长度不超过1000的等式,格式如上面描述。
输入数据直到文件结束。
Output:
如果A和B相等,输出YES;否则,输出NO。
Sample Input:
2
3+ 5 = 6 -2+ 4
3 +9-8+ 23 = 54 -52 + 2+ 6-8
Sample Output:
YES
NO
Hint: 建议字符串使用gets()输入
题意:以等式的形式输入一串字符,只包含数字,‘+’,‘-’,‘=’,空格,且数字间不会出现空格。判断等式是否成立。
思路:分等号左右两边输入,每次输入等号的一边,每次输入一个字符,遇见等号或者回车时结束输入。
输入的时候遇见数字便开始循环输入,直到出现的字符不是数字为止。
对‘+’,‘-’,进行判断,标记,运算时判断标记作出相应的计算。
对等号一边的输入设置一个sum,每次读入数字以后加上或减去,在重新开始输入之前储存sum。
比较储存的sum与第二轮得到的sum是否相同,相同输出YES,不同输出NO。
代码:
#include<stdio.h>
#include<math.h>
int main(){
int i,j,n,ans;
char ch,tmp[20];
while(scanf("%d",&n)==1)//输入n,代表案例数
{
getchar();//吞掉回车符
for(i=0;i<n;i++)//循环n次,每一次分成两大次输入,即,等号左边一次,等号右边一次
{
strat: int sum=0,count=0,Q=1;//goto strat就是用来实现两次大输入的,下面while是输入等号的一边。
while(scanf("%c",&ch)&&ch!='='&&ch!='\n')//while一次输入等号的一边。等号左边的终止标志是‘=’,等号右边的终止标志是‘\0’
{
if(ch=='+')Q=1;
else if(ch=='-')Q=-1;//判断符号,标记
if('0'<=ch&&ch<='9')//当输入的字符出现数字的时候(已知数字连续)
{
for(j=0;ch!=' '&&ch!='+'&&ch!='-'&&ch!='\n'&&ch!='=';j++,count++)//循环输入连续的数字到tmp数组,count累计数字个数,当出现‘ ’‘+’‘-’‘=’‘\n’表示输入连续数字终止。大数的话只要把tmp数组变大,外加一个大数的计算函数即可。
{
tmp[j]=ch;
scanf("%c",&ch);//实现连续输入
}
}
if(count)//判断是否有(连续)数字出现
for(j=0;count;count--,j++)
if(Q==1)sum+=(tmp[j]-'0')*pow(10.0,count-1);//符号标记Q用来判断是sum+,还是sum-。
else sum-=(tmp[j]-'0')*pow(10.0,count-1);
if(ch=='\n'||ch=='=')break;//出现‘\n’‘=’,跳出while循环,一次大输入结束
}
if(ch=='=')//如果是等号说明还有‘等号右边’没有输入
{
ans=sum;//储存sum值
goto strat;//返回输入‘等号右边’
}
else//这里的else即是‘\n’的情况,表示一次完整输入结束
{
if(ans==sum)printf("YES\n");//与上半次储存的sum值比较,相等输出YES,不相等输出NO
else printf("NO\n");
}
}
}
return 0;
}
注:
用gets输入的写法:用gets输入后存放在数组,写个函数计算等号左右边,空格就忽略,等号或者数组结束为停止,加减号相应运算,跟上面的算法差不多,只是gets把输入先存起来再计算。
此写法重点是提供了一种逐个输入的思路,某些情况下能有意想不到的效果,总体比较简单。
如果有心思可以研究下有多余空格下的,四则运算的写法,和带括号的四则运算写法,以及带小数点及无意义前导0、后导0的带括号四则运算写法,,,,,非常麻烦。。。。