顺序表实现:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define maxsize 1000
struct Data
{
double coef;
int exp;
};
struct List
{
Data* elem;
int length;
};
char s[100];
map <int, int> m;
bool cmp(Data a, Data b)
{
return a.exp < b.exp;
}
void InitList(List &L)
{
L.elem = (Data* )new Data[maxsize];
L.length = 0;
}
void Derivative(int len, List L)
{
int n = 1,flag = 0;
for(int i = 0;i < len;i ++)
{
double coef = L.elem[i].coef;
int exp = L.elem[i].exp;
if(exp == 0)
{
coef = 0;
}
else
{
coef *= exp;
exp --;
}
if(fabs(coef) < 1e-6)
continue;
else
{
flag = 1;
if(n != 1 && coef > 0)
printf("+");
if(exp == 0)
printf("%g", coef);
else if(coef!= 1 && exp != 0 && coef != -1)
{
if(exp == 1)
printf("%gx",coef);
else
printf("%gx^%d",coef, exp);
}
else if(coef == 1)
{
if(exp == 1)
printf("x");
else
printf("x^%d",exp);
}
else if(coef == -1)
{
if(exp == 1)
printf("-x");
else
printf("-x^%d",exp);
}
n ++;
}
}
if(!flag) printf("0");
printf("\n");
}
int main()
{
freopen("in.txt", "r", stdin);
List L;
int op1 = 1, op2 = 1,op3 = 1,op4 = 1;
double a;
int b, cases = 1,flag;
while(scanf("%s", s) != EOF)
{
printf("Case %d:\n",cases++);
InitList(L);
op1 = op2 = op3 = op4 = 1;
flag = 0;
int len = strlen(s);
for(int i = -10000;i <= 10000;i ++)
m[i] = -1;
int k = 0;
for(int i = 0;i < len;i ++)
{
a = 0;
b = 0;
op1 = op2 = 1;
if(s[0] == '-' && i == 0)
{
op4 = -1;
i ++;
}
if(s[i+1] == '(')
{
Derivative(k, L);
flag = 1;
}
if(s[i] == '=') break;
if(s[i] == '(') continue;
if(s[i] == ')')
{
i ++;
op4 = 1;
if(s[i] == '=')
{
if(!flag)
Derivative(k, L);
break;
}
else
{
flag = 1;
Derivative(k, L);
if(s[i] == '+')
op3 = 1;
else if(s[i] == '-')
op3 = -1;
}
}
if(s[i] == '-')
{
i ++;
op1 = -1;
}
else if(s[i] == '+')
{
i ++;
op1 = 1;
}
if(s[i] >= '0' && s[i] <= '9')
{
while(s[i] >= '0' && s[i] <= '9' && i < len)
{
a = a*10+(s[i]-'0');
i ++;
}
if(s[i] == '.')
{
i ++;
double x = 0.1;
while(s[i] >= '0' && s[i] <= '9' && i < len)
{
a += x*(s[i]-'0');
i ++;
x *= 0.1;
}
}
a = a*op1*op3*op4;
}
else if(s[i] == 'x')
{
a = op1*op3*op4;
}
if(s[i] == 'x')
{
i ++;
if(s[i] == '^')
{
i ++;
if(s[i] == '-')
{
o