题目传送门
字符串、数论的一道题,码量稍微大一些,细节较多,适合锻炼耐心和局部调试
#include <bits/stdc++.h>
using namespace std;
string s;
int length, tag; //tag表示=的位置
char x; //x表示未知数
double ans, leftnum, rightnum, leftx, rightx;
int main()
{
getline(cin, s);
length=s.length();
//找到等号
for(int i=0; i<length; ++i){
if(s[i]=='='){
tag=i; //tag表示=的位置
}
if(s[i]>='a' && s[i]<='z'){
x=s[i]; //x表示未知数
}
}
//计算等号左边的常数和、未知数的系数和
for(int i=0; i<tag; ++i){
double temp=0;
//负数
if(s[i]=='-'){
//参数是负数
//计算数字
for(i; i<tag; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
//处理-a这种情况
if(temp==0){
temp=1;
}
temp=-temp;
leftx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
if(temp==0){
temp=1;
}
temp=-temp;
leftnum+=temp;
}
break;
}
}
}
else if(s[i]=='+'){ //如果是加号
//参数是正数
//计算数字
for(i; i<tag; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
//处理+a这种情况
if(temp==0){
temp=1;
}
leftx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
if(temp==0){
temp=1;
}
leftnum+=temp;
}
break;
}
}
}
//处理开头参数为正的情况
if(i==0){
if(s[0]>='a' && s[0]<='z'){
leftx++;
continue;
}
else if(s[0]>='0' && s[0]<='9'){ //s[0]是数字
temp=s[0]-'0';
//参数是正数
//计算数字
for(i; i<tag; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
leftx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
leftnum+=temp;
}
break;
}
}
}
}
}
//计算等号右边的常数和、未知数的系数和
for(int i=tag+1; i<length; ++i){
double temp=0;
//负数
if(s[i]=='-'){
//参数是负数
//计算数字
for(i; i<length; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
//处理-a这种情况
if(temp==0){
temp=1;
}
temp=-temp;
rightx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
if(temp==0){
temp=1;
}
temp=-temp;
rightnum+=temp;
}
break;
}
}
}
else if(s[i]=='+'){ //如果是加号
//参数是正数
//计算数字
for(i; i<length; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
//处理+a这种情况
if(temp==0){
temp=1;
}
rightx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
if(temp==0){
temp=1;
}
rightnum+=temp;
}
break;
}
}
}
//处理=后面开头参数为正的情况
if(i==tag+1){
if(s[tag+1]>='a' && s[tag+1]<='z'){
leftx++;
continue;
}
else if(s[tag+1]>='0' && s[tag+1]<='9'){ //s[tag+1]是数字
temp=s[tag+1]-'0';
//参数是正数
//计算数字
for(i; i<length; ++i){
if(s[i+1]>='0' && s[i+1]<='9'){ //s[i+1]是数字
temp=temp*10+s[i+1]-'0';
}
else if(s[i+1]<'0' || s[i+1]>'9'){ //不是数字了
//是字母
if(s[i+1]>='a' && s[i+1]<='z'){
rightx+=temp;
}
else{ //下一个位置既不是数字, 也不是字母
rightnum+=temp;
}
break;
}
}
}
}
}
//未知数放在等号左边, 常数放在等号右边
rightnum-=leftnum;
leftx-=rightx;
ans=rightnum/leftx;
printf("%c=%.3lf", x, ans);
return 0;
}