这个题目确实简单(我还是犯了一些比较低级的错误,提交了几次才AC),本来是想用一个链表来保存的,后来发现不需要专门去实现,因为毕竟题目里只有两种情况,即未知数的幂为0或1,用一个数组就可以了,int a[2][2]; 其中a[0]是保存左边的式子,a[1]保存右边的式子,a[x][0] 用来保存式子中的常数之和,a[x][1]保存未知数的系数之和。
比如:5a+1-3+5=-2a-3+4+a,那么a[0][0] = 1 – 3 + 5,(左边式子常数和)a[0][1] = 5,a[1][0] = -3 + 4,a[1][1] = -2 + 1。代码如下:
C语言:
#include <stdio.h>
#include <ctype.h>
struct link{
int value;
int count;
};
int a[2][2];
int x;
int chin(void)
{
int ch;
do{
ch = getchar();
}while(ch == \' \');
return ch;
}
void getnum(struct link *to)
{
int ch, k = 1;
to->value = to->count = 0;
ch = chin();
if(ch == \'\\n\' || ch == \'=\'){
to->count = -1;
return ;
}
switch(ch){
case \'-\':
k = -1;
ch = chin(); //掉了这行
break;
case \'+\': //没考虑这种情况
ch = chin();
break;
}
do{
if(isalpha(ch)){
x = ch;
to->count = 1;
}else{
to->value *= 10;
to->value += ch - \'0\';
}
ch = chin();
}while(ch != \'+\' && ch != \'-\' && ch != \'=\' && ch != \'\\n\');
ungetc(ch, stdin);
if(to->value == 0){
to->value = 1;
}
to->value *= k;
}
int main(void)
{
int i = 0; //忘记初始化了
struct link t;
do{
getnum(&t);
if(t.count < 0){
i++;
}
switch(t.count){
case 0:
a[i][0] += t.value;
break;
case 1:
a[i][1] += t.value;
break;
}
}while(i != 2);
a[1][0] -= a[0][0];
a[0][1] -= a[1][1];
printf(%c=%.3f\\n, x, (float)a[1][0] / a[0][1]); // 顺序写反了
return 0;
}
其实这个代码完全有改进的余地,甚至可能还有错误(刚刚写这篇报告的时候就发现了一个错误)