Problem:
覆面算

数式の一部を隠してしまって、隠した数字を探す問題を覆面算といいます。今回は、数式の中のある数字のいくつかを X で隠してしまった式を扱います。以下の数式を入力して、結果を出力するプログラムを作成してください。

数式

「数字列 + 数字列 = 数字列」の形で、1 行の単純な足し算式です。

「数字列」は、数字 0 から 9 と文字 X の並びです。

2 桁以上の「数字列」の左端の数字は 0 ではないものとします。

X は、数式全体の中で必ず 1 つ以上含まれます。

結果

覆面算の答えです。数式が成り立つ様な X の値で 0 ~ 9 のどれか 1 つです。2 つ以上の答えはないものとします。

答えがない場合、結果は“NA”としてください。

Input

複数のデータセットが与えられます。各データセットとして、X を 1 つ以上含む足し算式(空白を含まない 126 文字以内の文字列) が１行に与えられます。データセットの数は 150 を超えません。

Output

各データセットについて、覆面算の結果を１行に出力してください。数字 0 ~ 9 または NA を出力してください。

Sample Input

123+4X6=X79
12X+4X6=X79
XX22+89=X2XX

Output for the Sample Input

5
NA
1

Solution in C# (judge verdict: Accepted)

using System;
using System.Text;
using System.Collections.Generic;
namespace aizu
{
    class OnlineJudge
    {
        static void Main()
        {
            string input;
            while((input = Console.ReadLine()) != null) {
                int number = -1;
                for(int i=0; i <= 9; ++i) {
                    string temp = input.Replace('X', (char)('0' + i));
                    string[] values = temp.Split("+=".ToCharArray());
                    if(i == 0) {
                        bool continueFlag = false;
                        for(int j=0; j < 3;++j){
                            if(values[j].Length >= 2 && values[j][0] == '0') {
                                continueFlag = true;
                                break;
                            }
                        }
                        if(continueFlag) {
                            continue;
                        }
                    }
                    if(values[2].CompareTo(AddStringNumber(values[0], values[1])) == 0) {
                        number = i;
                        break;
                    }
                }
                Console.WriteLine(number != -1 ? number.ToString() : "NA");
            }
        }
        static string AddStringNumber(string number1, string number2)
        {
            bool carry = false;
            StringBuilder result = new StringBuilder();
            Stack<char>[] number = new[] { new Stack<char>(number1.ToCharArray()), new Stack<char>(number2.ToCharArray()) };
            while(number[0].Count != 0 || number[1].Count != 0) {
                int total = ((number[0].Count > 0 ? number[0].Pop() : '0') + (number[1].Count > 0 ? number[1].Pop() : '0') + (carry ? 1 : 0)) - '0' * 2;
                carry = total / 10 != 0;
                result.Insert(0, (total % 10).ToString());
            }
            if(carry) {
                result.Insert(0, '1');
            }
            return result.ToString();
        }
    }
}