题目
给定一个字符串,代表一个 一元一次 方程。 如果有解求解,输出格式“x=数字” ,如果解的个数无穷,输出 “infinite solutions”。 如果 没有解输出“no solution”
字符串 长度不超过 256 。(只有+运算和-运算) 样例:
10x-2x-8=4x+7+x
输出:
x=5
代码实现
实现思路:首先根据‘+’,‘-’,‘=’等运算符,将读取的字符串分割为12x,2,8,等等。然后在Add函数里面再对分割的字符串进行处理。字符变量op记录每一个字符串的正负号。flag标注我们当前处理的字符串是在等式的右部还是左部。 代码片
.
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int x=0,n=0,xr=0,nr=0; int flag =0;
void Adds(string a,char op)
{
if(flag==0) // 等式左边
{
if(a[a.size()-1]=='x') // 处理的该项为x的系数
{
if(a=="x")
x += (op=='+'?1:-1);
else
{
a.erase(a.size()-1,a.size()); int temp = stoi(a);
x +=(op=='+'?temp:-temp);
}
}
else //处理的为常数项
{
int temp = stoi(a);
n +=(op=='+'?temp:-temp);
}
}
else // 处理的为等式右边
{
if(a[a.size()-1]=='x') //
{
if(a=="x")
xr += (op=='+'?1:-1);
else
{
a.erase(a.size()-1,a.size()); int temp = stoi(a);
xr +=(op=='+'?temp:-temp);
}
}
else
{
int temp = stoi(a);
nr +=(op=='+'?temp:-temp);
}
}
}
int main()
{
string str;getline(cin,str);int i=0;
char c = '+';if(str[0]=='-') {c='-'; i++;} // 判断第一项的正负号//若第一项为-x;i++
for(;i<str.size();i++)
{
string temp;
while(i<str.size() && str[i]!='-' && str[i]!='+' && str[i]!='=') // 获取每一项
{
temp +=str[i];i++;
}
Adds(temp,c);
if(str[i]=='=') // 处理等式右边置flag1,并且判断等式右边第一项的正负号
{ flag =1;
if(str[i+1]=='-') {c='-';i++;}//若等式后第一项为-x;i++
else c='+';
}
else c=str[i]; //改变符号
}
x = x-xr;nr = nr-n;
if(x==0 && nr!=0) // 无解
printf("No solution");
else if(x==0 && nr==0)//无穷多解
printf("infinite solutions");
else // 假设解都为正整数
printf("x=%d",nr/x);
// printf("%d %d %d %d",x,n,xr,nr);
}
;