历经千辛万苦终于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,不然会出错。

算法上可能可以更精简,但是暂时想不到了。

最后修改:2019 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏