| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1094 人关注过本帖
标题:一道青少年奥赛试题,谢谢!
只看楼主 加入收藏
小名叫小明
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-6-14
收藏
 问题点数:0 回复次数:10 
一道青少年奥赛试题,谢谢!

计算器的改良

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

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

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

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

样例

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

输出:
a=0.750

搜索更多相关主题的帖子: 奥赛 青少年 试题 
2006-06-14 12:31
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-06-14 16:15
蓝色神话
Rank: 2
等 级:论坛游民
威 望:1
帖 子:404
专家分:24
注 册:2006-5-11
收藏
得分:0 
以下是引用乌鸦丘比特在2006-6-14 16:15:20的发言:
不困难啊。分别记录变量的系数和和常数项的系数和就可以了嘛。
这个问题就是字符串处理的问题了

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

2006-06-14 18:46
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

本来是打算考完四级再上论坛的,
忍不住又来了,看了这道题,写了下,大体思路跟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-06-14 20:08
小名叫小明
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-6-14
收藏
得分:0 

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

2006-06-15 00:26
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
以下是引用蓝色神话在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 08:29
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-15 08:45
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-15 08:57
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
乌鸦,今年你不是要高考么?考得如何?

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-06-15 09:39
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
以下是引用baidu在2006-6-15 9:39:18的发言:
乌鸦,今年你不是要高考么?考得如何?

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


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-06-15 09:46
快速回复:一道青少年奥赛试题,谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033874 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved