NOIP 2000 计算器的改良 题解

 [NOIP2000] 计算器的改良

★★   输入文件: computer.in   输出文件: computer.out    简单对比
时间限制:1 s   内存限制:128 MB

问题描述

NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手 ZL 先生。为了很好的完成这个任务 ,ZL 先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12Y=0
ZL 先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及十、一、=这三个数学符号(当然,符号“一”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
问题求解:
编写程序,解输入文件中的一元一次方程,将解方程的结果(精确至小数点后三位)输出至输出文件。你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
【输入格式】
    输入文件只有一行。即一个合法的一元一次方程。
【输出格式】
    输出文件也只有一行。即该方程的解。
【输入输出样例】
输入文件名: computer.in
6a-5+1=2-2a
输出文件名:computer.out

a=0.750

这就是个大模拟....代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char a[2000];
char c[2000];
double ans;
int xi=0;
int st=0;
bool shu=0;
int r=0;
int re=0;
char yuan;
int l;
int main()
{
	
	
	freopen("computer.in","r",stdin);
	freopen("computer.out","w",stdout);
	cin>>a;                             //读入方程 
	l=strlen(a);
	for(int i=l-1;i>=0;i--)
	{
		if(a[i]=='-') a[i]='+';
		else
		if(a[i]=='+') a[i]='-';
		else
		if(a[i]=='=')
		{
		 a[i]='-';
		 break;
		}
	}                                 //将方程‘=’右的部分符号改变,然后都按左边处理 
	//cout<<a;
	a[l]='-';
	l++;                             //最后补一个符号,使最后一个数不会漏掉 
	for(int i=0;i<l;i++)
		{
			
			if(a[i]>='0'&&a[i]<='9')
			{
			  re=re*10+a[i]-'0';
			  shu=1;
			  st++;
			}                       //是数字的话就累计,类似快速读入 
			else
			if(shu)					//前面是数	
			{
		
				if(a[i]>='a'&&a[i]<='z') //当前是未知量 
				{
					
				  yuan=a[i];	       //记录未知量 用于输出 
				  if(i-st-1>=0)        //数前面的符号所在的位置 
				   {
					if(a[i-st-1]=='-')    
					xi-=re;
					else
					xi+=re;} else xi+=re;   //计算总系数 
					re=0;
					shu=0;
					st=0;                   //重置 
				}
				else                      //当前不是未知亮 
				{
				  if(i-st-1>=0)
					{
					if(a[i-st-1]=='-')
					r+=re;
					else
					r-=re;} else r-=re;   //计算将常数项移到右边后的总值 
					
					re=0;
					shu=0;
					st=0;                   //重置 
				}
			}
		}
		//printf("%d %d",r,xi);
		ans=double(r)/double(xi);
		if(fabs(ans-0)>0.0005)             //判断ans 范围 防止输出-0.000这种数字; 
		printf("%c=%.3lf",yuan,ans);
		else
		printf("%c=%.3lf",yuan,fabs(ans));
}                                         // ps:有一个小bug 是如果系数1省略的话就会出错,但对于这道题来说不会出现 (因为是计算器) 


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值