简单的带空格等式计算

带空格的等式

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的带括号四则运算写法,,,,,非常麻烦。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值