洛谷 P1022 [NOIP2000 普及组] 计算器的改良(模拟+面向样例编程)

P1022 NOIP2000 普及组 计算器的改良

菜鸟生成记(73)

面向样例编程,我是专业的,if,if,else,特判,特判,再特判
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
const int N=1e4+100;
int vis[N]={0};
void fun(string &num,int t,int &x,int &sum)
{
	int ans=0;
	int i=0;
	for(i=t;i<num.length();i++)
	{
		if(!isdigit(num[i]))
		break;
		ans=ans*10+num[i]-'0';//t-i数字字符组合一个数字(int) 
		vis[i]=1;//用过的数字字符标记 
	}
	if(num[t-1]=='-'&&islower(num[i]))//未知数 
	{//-5x
		x+=-ans;
	}
	else if(num[t-1]!='-'&&islower(num[i]))
	{//+5x or 5x
		x+=ans;
	}
	if(num[t-1]=='-'&&!islower(num[i]))//常数 
	{//-5
		sum+=-ans;
	}
	else if(num[t-1]!='-'&&!islower(num[i]))
	{//5 or +5
		sum+=ans;
	}
}
/*
20+3x=-18
x=-12.667
-5+12y=0
*/
int main()
{
	string num;
	char ch=0;
	int sum1=0;// 常数和左 
	int sum2=0;// 常数和右 
	int x1=0;// 未知数系数和左 
	int x2=0;// 未知数系数和右 
	int sum=0;//常数和(右) 
	int x=0;//未知数系数和(左) 
	int f=0;
	double ans=0;
	cin>>num;
	for(int i=0;i<num.length();i++)
	{
		if(num[i]=='=')
		f=1;
		if(islower(num[i]))
		{//找未知数字符 
			ch=num[i];
		}
		if(f==0)//方程左边 
		{
			if(isdigit(num[i])&&!vis[i])
			{//数字累加 
			//x1:未知数累加和 
			//sum1:常数累加和 
				fun(num,i,x1,sum1);
			}
			if(islower(num[i]))
			{//特判(-x or x 系数为1,但是没有写) 
				if(num[i-1]=='-')
				x1+=-1;
				else if(num[i]!='-'&&!isdigit(num[i-1]))
				x1+=1;
			}
		}
		else//方程右边 
		{
			if(isdigit(num[i])&&!vis[i])
			{
				fun(num,i,x2,sum2);
			}
			if(islower(num[i]))
			{
				if(num[i-1]=='-')
				x2+=-1;
				else if(num[i]!='-'&&!isdigit(num[i-1]))
				x2+=1;
			}
		}
	}
	//cout<<sum1<<" "<<sum2<<endl;
	//cout<<x1<<" "<<x2<<endl;
	sum=sum2-sum1;
	x=x1-x2;
	ans=1.0*sum/x;
	if(ans==-0)//又是一个小细节(C/C++负数除以0==-0,就离谱) 
	ans=-ans;
	printf("%c=%.3lf",ch,ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值