1 class Solution
2 {
3 private:
4 enum op {PLUS,MINUS};
5 int left_constant_sum = 0;
6 int left_x_sum = 0;
7 int right_constant_sum = 0;
8 int right_x_sum = 0;
9 public:
10 void pre_measure(string& s)
11 {
12 for(int i = 0;i < s.size();i ++)
13 {
14 if(s[i]=='0'&&s[i+1]=='x'&&(i==0||!isdigit(s[i-1])))
15 s[i+1]='0';
16 }
17 }
18 string solveEquation(string equation)
19 {
20 enum op OP = PLUS;
21 int index;
22 int tmp_store = 0;
23 int zero_x_warning;
24 pre_measure(equation);
25 for(index = 0; equation[index]!='='; index ++)
26 {
27 if(isdigit(equation[index]))
28 {
29 tmp_store = 10 * tmp_store + equation[index]-'0';
30 }
31 else if(equation[index]=='x')
32 {
33 if(OP==PLUS)
34 {
35 if(tmp_store!=0)
36 left_x_sum += tmp_store;
37 else
38 left_x_sum ++;
39 }
40 else
41 {
42 if(tmp_store!=0)
43 left_x_sum -= tmp_store;
44 else
45 left_x_sum --;
46 }
47 tmp_store = 0;
48 }
49 else // is '+' or '-'
50 {
51 if(OP==PLUS)
52 left_constant_sum += tmp_store;
53 else
54 left_constant_sum -= tmp_store;
55 if(equation[index]=='+')
56 OP = PLUS;
57 else
58 OP = MINUS;
59 tmp_store = 0;
60 }
61 }
62 if(OP==PLUS)
63 left_constant_sum += tmp_store;
64 else
65 left_constant_sum -= tmp_store;
66 tmp_store = 0;
67
68 for(OP = PLUS,index ++; index < equation.size(); index ++)
69 {
70 if(isdigit(equation[index]))
71 {
72 tmp_store = 10 * tmp_store + equation[index]-'0';
73 }
74 else if(equation[index]=='x')
75 {
76 if(OP==PLUS)
77 {
78 if(tmp_store!=0)
79 right_x_sum += tmp_store;
80 else
81 right_x_sum ++;
82 }
83 else
84 {
85 if(tmp_store!=0)
86 right_x_sum -= tmp_store;
87 else
88 right_x_sum --;
89 }
90 tmp_store = 0;
91 }
92 else // is '+' or '-'
93 {
94 if(OP==PLUS)
95 right_constant_sum += tmp_store;
96 else
97 right_constant_sum -= tmp_store;
98 if(equation[index]=='+')
99 OP = PLUS;
100 else
101 OP = MINUS;
102 tmp_store = 0;
103 }
104 }
105 if(OP==PLUS)
106 right_constant_sum += tmp_store;
107 else
108 right_constant_sum -= tmp_store;
109 //cout << left_constant_sum << " " << left_x_sum << " " << right_constant_sum << " " << right_x_sum << endl;
110
111 string result;
112 if(left_constant_sum == right_constant_sum
113 && left_x_sum == right_x_sum)
114 result = "Infinite solutions";
115 else if(left_x_sum == right_x_sum)
116 result = "No solution";
117 else
118 {
119 result = "x=";
120 char tmp_s[1000];
121 sprintf(tmp_s,"%d",(right_constant_sum-left_constant_sum)/(left_x_sum-right_x_sum));
122 result += tmp_s;
123 }
124 return result;
125 }
126 };