此题没啥特别说的 就是需要特盘一下 解出来为0的值 因为计算器可能就出来是-1
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
char arr[100] = { 0 };
scanf("%s", arr);
char arr1[100] = { 0 };// 存放未知的系数
int sum1 = 0;
int sum2 = 0;
char zimu = 0;
int k = 0;
int a = 0;
while (arr[k] != '\0')
{
if (arr[k] == '=')
a = k;
k++;
}// a位置就是 等号 的位置
// k的位置就是 \0 的位置
int i = 0;
int x = 0;
//未知数前面系数的部分
for (i = 0; i < k; ++i)
{
if ((arr[i] >= 'a') && (arr[i] <= 'z'))
{
int b = i;
zimu = arr[i];
if (i < a)//等式左边的
{
if ((arr[i - 1] == '+') || (i - 1 == -1))
{
arr1[x] ='1'; arr1[x + 1] = '+';
x+=2;
}
else if(arr[i-1]=='-')
{
arr1[x] = '1'; arr1[x + 1] = '-';
x+=2;
}
else
{
while (1)
{
arr1[x] = arr[b - 1];
if ((arr[b - 2] == '+') || (b - 2 == -1))
{
arr1[x + 1] = '+'; x += 2; break;
}
else if (arr[b - 2] == '-')
{
arr1[x + 1] = '-'; x += 2; break;
}
else
{
x++;
b--;
}
}
}
}
else //等式右边的
{
if ((arr[i - 1] == '+')||(arr[i-1]=='='))
{
arr1[x] = '1'; arr1[x + 1] = '-';
x += 2;
}
else if (arr[i - 1] == '-')
{
arr1[x] = '1'; arr1[x + 1] = '+';
x += 2;
}
else
{
while (1)
{
arr1[x] = arr[b - 1];
if ((arr[b - 2] == '+') || (arr[b-2]=='='))
{
arr1[x + 1] = '-'; x += 2; break;
}
else if (arr[b - 2] == '-')
{
arr1[x + 1] = '+'; x += 2; break;
}
else
{
x++;
b--;
}
}
}
}
}
}
x++;
x++;//空两个各自 区分上下部分
//常数部分
for (i = 0; i <= k; ++i)
{
if ((arr[i] == '+') || (arr[i] == '-') || (arr[i] == '=')||(i==k))
{
int b = i;
if (i <= a)//等式左边的
{
if ((i - 1 == -1) || ((arr[i - 1] >= 'a') && (arr[i - 1] <= 'z')))
{
;
}
else
{
while (1)
{
arr1[x] = arr[b - 1];
if ((arr[b - 2] == '+') || (b - 2 == -1))
{
arr1[x + 1] = '-'; x += 2; break;
}
else if ((arr[b - 2] == '-'))
{
arr1[x + 1] = '+'; x += 2; break;
}
else
{
x++;
b--;
}
}
}
}
else //等式右边的
{
{
if ((arr[i - 1] == '=') || ((arr[i - 1] >= 'a') && (arr[i - 1] <= 'z')))
{
;
}
else
{
while (1)
{
arr1[x] = arr[b - 1];
if ((arr[b - 2] == '+') || (arr[b - 2] == '='))
{
arr1[x + 1] = '+'; x += 2; break;
}
else if ((arr[b - 2] == '-'))
{
arr1[x + 1] = '-'; x += 2; break;
}
else
{
x++;
b--;
}
}
}
}
}
}
}
// 开始计算 i x k 都可用
i = 0;
int min = 0, max = 0;
while (arr1[i] != '\0')
{
max = min+1;
while (1)
{
if ((arr1[max] == '+') || (arr1[max] == '-'))
break;
max++;
}
int jet = min;
for (k = 0; k <= max-min-1; k++)
{
if (arr1[max] == '-')
sum1 = sum1 - ((arr1[jet] - '0') * pow(10, k));
else
sum1 = sum1 + ((arr1[jet] - '0') * pow(10, k));
jet++;
}
min = max + 1;
i = min;
}
i = i + 2;
min = i;
while (arr1[i] != '\0')
{
max = min + 1;
while (1)
{
if ((arr1[max] == '+') || (arr1[max] == '-'))
break;
max++;
}
int jet = min;
for (k = 0; k <= max - min-1; k++)
{
if (arr1[max] == '-')
sum2 = sum2 - ((arr1[jet] - '0') * pow(10, k));
else
sum2 = sum2 + ((arr1[jet] - '0') * pow(10, k));
jet++;
}
min = max + 1;
i = min;
}
if ((sum2 == 0) || (sum2 == -0))
printf("a=0.000");
else
printf("%c=%.3f",zimu,sum2/1.0/sum1);
return 0;
}
可以继续优化 各位大佬可以来讨论一下