当前位置: 代码迷 >> C语言 >> 一道青少年奥赛试题,谢谢!
  详细解决方案

一道青少年奥赛试题,谢谢!

热度:396   发布时间:2006-06-14 12:31:46.0
一道青少年奥赛试题,谢谢!

计算器的改良

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

4+3x=8
6a-5+1=2-2a
-5+12y=0

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

问题求解:
编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

样例

输入:
6a-5+1=2-2a

输出:
a=0.750

搜索更多相关的解决方案: 奥赛  青少年  试题  

----------------解决方案--------------------------------------------------------
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了
----------------解决方案--------------------------------------------------------
以下是引用乌鸦丘比特在2006-6-14 16:15:20的发言:
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了

不要想当然,有些事想起来很容易,做起来就不容易了!
----------------解决方案--------------------------------------------------------

本来是打算考完四级再上论坛的,
忍不住又来了,看了这道题,写了下,大体思路跟2楼的差不多,
不过这个程序还不完善,只提供不超过两位数的一次方程。像-5+12y=0这个方程还是解不了的。
写的比较乱,等考完四级再来改吧,

#include "stdio.h"
#include "conio.h"
#include "ctype.h"
typedef struct NODE
{
char ch;
struct NODE *next,*fore;
}node;
int sum[2]={0};
void getequation(node *head,char s[]);
void calculate(node *head);
int chtonum(char ch);
int main()
{
node *head=(node *)malloc(sizeof(node));
char str[100];
gets(str);
head->fore=head->next=NULL;
head->ch='*';
getequation(head,str);
calculate(head);
printf("%g",(float)sum[1]/sum[0]);
getch();
}
void getequation(node *head,char s[])
{
node *p,*q=head;
char fetch;
int i=0;
fetch=s[i++];
while(fetch!='\0')
{
p=(node *)malloc(sizeof(node)); /*这里省去内存申请检验*/
p->ch=fetch;
p->next=NULL;
q->next=p;
p->fore=q;
q=p;
fflush(stdin);
fetch=s[i++];
}
}
void calculate(node *head)
{
node *p=head;
int tag=0;
while(p)
{
p=p->next;
if(p->ch=='=')
tag=1;
if(isalpha(p->ch))
{
if(!tag)
{
if(isdigit(p->fore->ch))
{
switch(p->fore->fore->ch)
{
case '*':
case '+':sum[0]+=chtonum(p->fore->ch);break;
case '-':sum[0]-=chtonum(p->fore->ch);break;
}
}
else
{
if(p->fore->ch=='+'||p->fore->ch=='*') sum[0]++;
if(p->fore->ch=='-') sum[0]--;
}
}
else {
if(isdigit(p->fore->ch))
{
switch(p->fore->fore->ch)
{

case '+':sum[0]-=chtonum(p->fore->ch);break;
case '-':sum[0]+=chtonum(p->fore->ch);break;
}
}
else
{
if(p->fore->ch=='+') sum[0]--;
if(p->fore->ch=='-'||p->fore->ch=='=') sum[0]++;
}
}
}
if(isdigit(p->ch)&&!isalpha(p->next->ch))
{
if(!tag)
{
if(p->fore->ch=='*'||p->fore->ch=='+')
sum[1]-=chtonum(p->ch);
if(p->fore->ch=='-')
sum[1]+=chtonum(p->ch);
}
else
{
if(p->fore->ch=='-')
sum[1]-=chtonum(p->ch);
if(p->fore->ch=='+'||p->fore->ch=='=')
sum[1]+=chtonum(p->ch);
}
}
}
}

int chtonum(char ch)
{
return ch-48;
}


----------------解决方案--------------------------------------------------------

刚开始学,感觉很迷茫.谢谢你们给的回复!努力!努力!


----------------解决方案--------------------------------------------------------
以下是引用蓝色神话在2006-6-14 18:46:05的发言:

不要想当然,有些事想起来很容易,做起来就不容易了!

我认为在算法上的确没有难度

#include <stdio.h>
#define NMAX 32
/*宏,把缓冲区里面的数字加入x变量*/
#define Add_num(x) x+=getnum(num,numlen)*plus; numlen=0;
double getnum(char *num,int nlen)
{/*把字符串变为相应的数字*/
double ans;
if(!nlen) return 0;
num[nlen]='\0';
sscanf(num,"%lf",&ans);
return ans;
}
void find(char *s)
{/*plus记录当前缓冲区数字符号,a记录变量系数和,b记录常数项系数和*/
/*把式子当作全部移项到左边处理*/
double plus,a,b,ans,fuhao;
char num[NMAX],c;
int numlen;
fuhao=1;plus=1;numlen=0;a=0;b=0;
while(*s){
switch(*s){
case '+':Add_num(b) plus=fuhao ; break;
case '-':Add_num(b) plus=-fuhao; break;
case '=':Add_num(b) fuhao=-fuhao;plus=fuhao;break;
case '.':num[numlen++]=*s; break;
default :
if(*s>='a'&&*s<='z'){
Add_num(a) c=*s;
}
else num[numlen++]=*s;
}
s++;
}
Add_num(b)
ans=-(b/a);
printf("%c=%.3lf\n",c,ans);
}
#define EXPMAX 256
int main()
{
char expr[256];
while(scanf("%s",expr)==1){
find(expr);
}
return 0;
}



----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-15 00:45:18
穆扬

等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
  得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-15 00:57:30
baidu

等 级:新手上路
威 望:8
帖 子:3812
专家分:0
注 册:2005-11-4
  得分:0 
乌鸦,今年你不是要高考么?考得如何?
----------------解决方案--------------------------------------------------------
以下是引用baidu在2006-6-15 9:39:18的发言:
乌鸦,今年你不是要高考么?考得如何?

这个,我在=成绩,成绩出来再说吧。现在能够编程就够好LI


----------------解决方案--------------------------------------------------------
  相关解决方案