历经千辛万苦终于AC。。
原题如下:
#include <stdio.h>
#include <string.h>
void fc(char* fc); //这个函数就是用来解方程的
int main()
{
int t = 0;
char fcc[100];
scanf("%d", &t);
while (t != 1)
{
scanf(" %s", fcc);
fc(fcc);
printf("\n");
t--;
}
scanf("%s", fcc);
fc(fcc);
return 0;
}
void fc(char* fc)
{
int xleft = 0, xright = 0, left = 0, right = 0;
int dengyu = 0;
int flag = 1;
int d = strlen(fc);
{ //等号左边
for (int i = 0; i < d; ++i) //求出等号,以便下面求左边右边
{
if (fc[i] == '=')
{
dengyu = i;
break;
}
}
int p = 0;
for (int i = 0; i < dengyu; ++i)//先弄第一次把第一个符号取出来,flag为1就是+,flag为0就是-
{
if (fc[i] == '+')
{
int t = 0;
flag = 1;
if (fc[0] == 'x') //若第一项就是x 那么直接xleft+1
{
xleft++;
p = 1;
break;
}
else if (fc[i - 1] != 'x')
{
for (int j = 0; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
else if (fc[i - 1] == 'x')
{
for (int j = 0; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
}
else if (fc[i] == '-')
{
int t = 0;
flag = 0;
if (fc[0] == 'x') //若第一项就是x 那么直接xleft+1
{
xleft++;
p = i + 1;
break;
}
else if (fc[i - 1] != 'x')
{
for (int j = 0; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
else if (fc[i - 1] == 'x')
{
for (int j = 0; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
}
}
for (int i = p; i < dengyu; ++i)//处理第二项到等号那一项 下面都是遍历寻找“+”号“-”号然后作标记在处理
{
if (fc[i] == '+')
{
int t = 0;
if (flag == 1)
{
if (fc[p] == 'x')
{
xleft++;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left += t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft += t;
p = i + 1;
}
}
else if (flag == 0)
{
if (fc[p] == 'x')
{
xleft--;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left -= t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft -= t;
p = i + 1;
}
}
flag = 1;
}
else if (fc[i] == '-')
{
int t = 0;
if (flag == 1)
{
if (fc[p] == 'x')
{
xleft++;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left += t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft += t;
p = i + 1;
}
}
else if (flag == 0)
{
if (fc[p] == 'x')
{
xleft--;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
left -= t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xleft -= t;
p = i + 1;
}
}
flag = 0;
}
}
{ //处理等号左边最后一项
if (flag == 1)
{
int t = 0;
if (fc[p] == 'x')
{
xleft++;
}
else if (fc[dengyu - 1] != 'x')
{
for (int k = p; k < dengyu; ++k)
{
t = t * 10 + (fc[k] - '0');
}
left += t;
}
else if (fc[dengyu - 1] == 'x')
{
for (int k = p; k < dengyu - 1; ++k)
{
t = t * 10 + (fc[k] - '0');
}
xleft += t;
}
}
if (flag == 0)
{
int t = 0;
if (fc[p] == 'x')
{
xleft--;
}
else if (fc[dengyu - 1] != 'x')
{
for (int k = p; k < dengyu; ++k)
{
t = t * 10 + (fc[k] - '0');
}
left -= t;
}
else if (fc[dengyu - 1] == 'x')
{
for (int k = p; k < dengyu - 1; ++k)
{
t = t * 10 + (fc[k] - '0');
}
xleft -= t;
}
}
}
} //等号左边
////////////////////////////////////
{
flag = 1;
int p = dengyu + 1;
for (int i = dengyu + 1; i < d; ++i)//先弄第一次把第一个符号取出来,flag为1就是+,flag为0就是-
{
if (fc[i] == '+')
{
int t = 0;
flag = 1;
if (fc[dengyu + 1] == 'x') //若第一项就是x 那么直接xringht+1
{
xright++;
p += 2;
break;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
}
else if (fc[i] == '-')
{
int t = 0;
flag = 0;
if (fc[dengyu + 1] == 'x') //若第一项就是x 那么直接xleft+1
{
xright++;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright += t;
p = i + 1; //p是符号的下标(=/-)
break;
}
}
}
for (int i = p; i < d; ++i)//处理第二项到等号那一项
{
if (fc[i] == '+')
{
int t = 0;
if (flag == 1)
{
if (fc[p] == 'x')
{
xright++;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right += t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright += t;
p = i + 1;
}
}
else if (flag == 0)
{
if (fc[p] == 'x')
{
xright--;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right -= t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright -= t;
p = i + 1;
}
}
flag = 1;
}
else if (fc[i] == '-')
{
int t = 0;
if (flag == 1)
{
if (fc[p] == 'x')
{
xright++;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right += t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright += t;
p = i + 1;
}
}
else if (flag == 0)
{
if (fc[p] == 'x')
{
xright--;
p += 2;
}
else if (fc[i - 1] != 'x')
{
for (int j = p; j < i; ++j)
{
t = t * 10 + (fc[j] - '0');
}
right -= t;
p = i + 1;
}
else if (fc[i - 1] == 'x')
{
for (int j = p; j < i - 1; ++j)
{
t = t * 10 + (fc[j] - '0');
}
xright -= t;
p = i + 1;
}
}
flag = 0;
}
}
{ //处理等号右边最后一项
if (flag == 1)
{
int t = 0;
if (fc[p] == 'x')
{
xright++;
}
else if (fc[d - 1] != 'x')
{
for (int k = p; k < d; ++k)
{
t = t * 10 + (fc[k] - '0');
}
right += t;
}
else if (fc[d - 1] == 'x')
{
for (int k = p; k < d - 1; ++k)
{
t = t * 10 + (fc[k] - '0');
}
xright += t;
}
}
if (flag == 0)
{
int t = 0;
if (fc[p] == 'x')
{
xright--;
}
else if (fc[d - 1] != 'x')
{
for (int k = p; k < d; ++k)
{
t = t * 10 + (fc[k] - '0');
}
right -= t;
}
else if (fc[d - 1] == 'x')
{
for (int k = p; k < d - 1; ++k)
{
t = t * 10 + (fc[k] - '0');
}
xright -= t;
}
}
}
}
if (xleft == xright && left == right)
{
printf("IDENTITY");
}
else if (xleft == xright)
{
printf("IMPOSSIBLE");
}
else
{
double x = 0;
double con = 0;
double sum = 0;
double sum1 = 0;
x = xleft - xright;
con = right - left;
sum = con / x;
if (sum == -0)
sum = 0;
//if (sum > (int)(sum) && sum > 0)
//{
// sum1 = (int)sum + 1;
// printf("%.0lf", sum1);
//}
//else
if (sum < (int)(sum) && sum < 0)
{
sum1 = (int)sum - 1;
printf("%.0lf", sum1);
}
else
printf("%.0lf", sum); //不输出小数点后的位数
}
}
主要是对字符串的处理,思路很简单,但是写起来不知道为什么这么麻烦,并且结果的精度也有一定的控制。然后flag那里初始化应该为1,当第一个字符为-号时要初始化为0,不然会出错。
算法上可能可以更精简,但是暂时想不到了。