计算器的改良

在codevs上遇到一个挺新颖的题目,设计算法解一元一次方程。

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:

 

   4+3x=8

   6a-5+1=2-2a

  -5+12y=0

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出至屏幕。

 你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入描述 Input Description

一个一元一次方程

输出描述 Output Description

方程的解

样例输入 Sample Input

6a-5+1=2-2a

样例输出 Sample Output

a=0.750

#include <stdio.h>
#define M 200
int main(void)
{
	char equation[M]; //接收一元一次方程
	int i=0; //用于遍历字符数组
	int type=1; //用于判断数据类型,是纯数字还是字母的数量
	int ntmp=0; //用于接收当前某类型的总和
	int ntype = 1; //判断是+还是-
	int sAlphabet=0,sNum=0; //字母的总和和数字的总和
	char stmp,alpha;//接受每一位的字符,接收未知数
	int local=1; //判断字符的遍历位于等号的左边还是右边
	double result=0;
	scanf("%s",equation);
	while((stmp = equation[i++])!='\0')
	{
		if(stmp>='0'&&stmp<='9')
		{
			ntmp = ntmp*10+(stmp-'0');
		}
		else if(stmp>='a'&&stmp<='z')
		{
			type = 0;
			alpha = stmp;
			if(ntmp==0)
			{
				ntmp=1;
			}
		}
		else if(stmp=='+'||stmp=='-')
		{
			if(type)
			{
				sNum+=(ntmp*ntype*local);
			}
			else
			{
				sAlphabet+=(ntmp*ntype*local);
			}
			type = 1;
			ntmp=0;
			ntype = (stmp=='+'?1:-1);
		}
		else if(stmp=='=')
		{
			if(type)
			{
				sNum+=(ntmp*ntype*local);
			}
			else
			{
				sAlphabet+=(ntmp*ntype*local);
			}
			type = 1;
			ntmp=0;
			ntype = 1;
			local = -1;
		}
	}
	if(type)
	{
		sNum+=(ntmp*ntype*local);
	}
	else
	{
		sAlphabet+=(ntmp*ntype*local);
	}
	result = -(double)sNum/(double)sAlphabet;
	printf("%c=%-.3lf\n",alpha,result);
	return 0;
} 
声明的变量有些多,但功能都简单,大部分用于判断,主要实现是用一次循环遍历加上一些if判断,思路简单,但if判断要考虑的条件要充分。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值