题目要求给定一个可能正确的式子 \(a+b=c\),要求将其进行转换得到正确的式子。
因为题目要求“把等号左边移一根火柴棒到右边”,所以很容易看出有这几种情况是可以做到的:
\[a+b=c
\]
直接就满足条件,不用移动。
\[\begin{cases}
(a-1)+b=(c+1)\\
a+(b-1)=(c+1)\\
\end{cases}\]
分别代表在 \(a\) 中移动一根到 \(c\),以及在 \(b\) 中移动一根到 \(c\)。
\[\begin{cases}
(a+1)+b=(c-1)\\
a+(b+1)=(c-1)\\
\end{cases}\]
分别代表在 \(c\) 中移动一根到 \(a\),以及在 \(c\) 中移动一根到 \(b\)。
稍加计算即可将其整理成三个式子:
\[\begin{cases}
a+b=c\\
a+b=c+2\\
a+b=c-2\\
\end{cases}\]
这三种情况是可行的,否则是不行的(输出 Impossible
)。
注意一点:输出不能为 ||+=||
或 +||=||
的形式(即 \(a\) 或 \(b\) 为 \(0\))。
其它细节看代码:
#include<cstdio>
using namespace std;int a,b,c;inline void Read() //用于读入 a,b,c
{char ch=getchar();while(ch=='|') a++,ch=getchar();ch=getchar();while(ch=='|') b++,ch=getchar();ch=getchar();while(ch=='|') c++,ch=getchar();return;
}
inline void Print(int x,int y,int z) //用于输出指定“|”数量的等式
{for(int i=1;i<=x;i++) printf("|");printf("+");for(int i=1;i<=y;i++) printf("|");printf("=");for(int i=1;i<=z;i++) printf("|");printf("\n");return;
}
int main()
{Read(); //输入 a,b,c if(a+b==c) Print(a,b,c); //情况1:满足条件直接输出 else if(a+b==c+2) //情况2:从左往右移动火柴棒 {if(a!=1) Print(a-1,b,c+1); //避免“0+b=c”的情况 else Print(a,b-1,c+1);/*不会出现 a+b=c+2 且 a,b 均为 1,输出 Impossinle 的情况因为若出现,则该式子必定为 1+1=0而题目中“a,b,c>=1”所以 c 不可能为 0故这里不用特判 b!=0 也能 AC */}else if(a+b==c-2) //情况3:从右往左移动火柴棒 Print(a+1,b,c-1); //c-2 为正整数,c-1也必定为正整数,这里也不用特判 else printf("Impossible\n"); //若以上情况都不满足,表明不可能得到正确的等式 return 0;
}
\[\frak{The ~ End}
\]
2022-08-10 21:24 撰写于洛谷,2025-08-29 20:32 迁移至博客园。