| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
代码写的有点乱。打了很多注释。将就看吧。。。。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_N 120
char istr[MAX_N];
char ostr[MAX_N];
void init()
{
memset(istr, 0, sizeof(istr));
memset(ostr, 0, sizeof(ostr));
}
int findright(char * str, int pos)
{
int i;
int left = 0, right = 0;
int len = strlen(str);
// printf("findright str = %s, pos = %d\n", str, pos);
for(i = pos; i<len; i++)
{
if(str[i] == '(')
{
left++;
}else if(str[i] == ')' )
{
right++;
}
if(left == right)
return i;
}
}
int findop(char *str, int start, char *op, int flag, char *ostr)
{
int i, pos = 0;
int len = strlen(str);
// printf("findop begin str = %s, flag = %d, pos = %d\n", str, flag, start);
for(i = start; i<len; i++)
{
if(str[i] =='(')
{
pos = findright(str , i);
i = pos;
//找出右端点
}else if(str[i] == 'l')
{
pos = findright(str+i+2, i);
i = pos;
//找出右端点
}else if(str[i] == '+'|| str[i] == '-'||str[i] == '*'|| str[i] == '/')
{
if(flag == 0 && i == 0)
continue;
memcpy(ostr, str+start, i-start);
*op = str[i];
return i;
}
}
memcpy(ostr, str+start, i-start);
return i;
}
void Derivation(char * in, char *out)
{
char astr[MAX_N] = {0};
char bstr[MAX_N] = {0};
char cstr[MAX_N] = {0};
char dstr[MAX_N] = {0};
char mstr[MAX_N] = {0};//寻找乘法串。。
char fstr[MAX_N] = {0};
char temp[MAX_N] = {0};
char lop = 0, op = 0, opy;
int i = 0, j = 0, begin = 0;
int flag = 0, pos;
int len1;
int len = strlen(in);
// printf("Derivation in = %s, len = %d\n", in, len);
for(i = 0; i<len; i++)
{
memset(temp, 0, sizeof(temp));
lop = op;
op = 0;
pos = findop(in, i, &op, flag, temp );
// printf("findop results in = %s, temp = %s, op = %c, pos = %d\n", in, temp, op, pos);
i = pos;
// printf("which in = %s, op = %c, lop = %c \n", in, op, lop);
if(((op == '+' || op == '-') && (lop == '*' || lop == '/' )) || (op == 0 &&(lop == '*' || lop == '/' )) )
{
//找到了最外层的*, /
len1 = strlen(fstr);
fstr[len1-1] = '\0';
memset(astr, 0, sizeof(astr));
memset(bstr, 0, sizeof(bstr));
// printf("multiply and divide, fstr = %s\n", fstr);
Derivation(fstr, astr);
Derivation(temp, bstr);
opy = op;
if(op == 0)
op = lop;
// printf("fstr = %s, temp = %s\n", fstr, temp);
// printf("in = %s, astr = %s, bstr = %s, op = %c\n", in, astr, bstr, op);
memset(cstr, 0, sizeof(cstr));
if(lop == '*' )
{
if(fstr[0] == '-')
sprintf(cstr, "(%s*%s%s*%s)", astr, temp, fstr, bstr);
else
sprintf(cstr, "(%s*%s+%s*%s)", astr, temp, fstr, bstr);
}else if(lop == '/' )
{
if(fstr[0] == '-')
{
fstr[0] = '+';
sprintf(cstr, "(%s*%s%s*%s)/%s^2", astr, temp, fstr, bstr, temp);
}
else
sprintf(cstr, "(%s*%s-%s*%s)/%s^2", astr, temp, fstr, bstr, temp);
}
strcat(dstr, cstr);
memset(cstr, 0, sizeof(cstr));
if(opy != 0)
{
sprintf(cstr, "%c", opy);
}
strcat(dstr, cstr);
// printf("opy = %c, cstr = %s, dstr = %s\n", opy, cstr, dstr);
memset(fstr, 0, sizeof(fstr));
lop = 0;
}else if (((op == '+' || op == '-') && lop!='*' && lop!='/') ||(op == 0 && (lop == '+' || lop == '-' )))
{
memset(astr, 0, sizeof(astr));
Derivation(temp, astr);
memset(bstr, 0, sizeof(bstr));
sprintf(bstr, "%s", astr);
strcat(dstr, bstr);
// printf("normal1 bstr = %s, dstr = %s, op = %d\n", bstr, dstr, op);
memset(bstr, 0, sizeof(bstr));
if(op != 0)
{
sprintf(bstr, "%c", op);
}
strcat(dstr, bstr);
// printf("normal2 bstr = %s, dstr = %s\n", bstr, dstr);
lop = 0;
}else if(op == '*' || op == '/')
{
// printf("opis mul and div\n");
memset(mstr, 0, sizeof(mstr));
sprintf(mstr,"%s%c",temp, op);
strcat(fstr, mstr);
// printf("mstr = %s, fstr = [%s]\n", mstr, fstr);
}else if(op == 0 && lop == 0 )
{
if(in[0] == '-' || (in[0]>='0' && in[0]<='9') ) //constant
{
// printf("in = %s, is constant\n", in);
memset(mstr, 0, sizeof(mstr));
sprintf(mstr,"0");
strcat(dstr, mstr);
}else if(in[0] == 'x')
{
// printf("in = %s, is x\n", in);
memset(mstr, 0, sizeof(mstr));
sprintf(mstr,"1");
strcat(dstr, mstr);
}else if(in[0] == 'l')
{
len1 = strlen(temp);
memset(astr, 0, sizeof(astr));
memcpy(astr, temp+3, len1 - 4 );
// printf("in = %s, is ln, astr = %s\n", in, astr);
memset(bstr, 0, sizeof(bstr));
Derivation(astr, bstr);
memset(cstr, 0, sizeof(cstr));
sprintf(cstr, "(%s)/(%s)", bstr, astr);
strcat(dstr, cstr);
// printf("in = %s, is ln, astr = %s, bstr = %s, cstr = %s, dstr\n", in, astr, bstr, cstr, dstr);
}else if(in[0] == '(')
{
len1 = strlen(temp);
memset(astr, 0, sizeof(astr));
memcpy(astr, temp+1, len1 - 2 );
memset(bstr, 0, sizeof(bstr));
// printf("in = %s, is kuohao astr = %s\n", in, astr);
Derivation(astr, bstr);
memset(cstr, 0, sizeof(cstr));
sprintf(cstr, "(%s)", bstr);
strcat(dstr, cstr);
// printf("in = %s, is kuohao astr = %s, bstr = %s, dstr = %s\n", in, astr, bstr, dstr);
}
}
flag == 1; //
}
sprintf(out, "%s", dstr);
return ;
}
int main()
{
int i, j;
init();
while(scanf("%s", istr)!=EOF)
{
// printf("istr = %s\n", istr );
Derivation(istr, ostr);
// printf("ostr = %s\n", ostr );
printf("%s\n", ostr );
init();
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator