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.Collections.Generic;

public class AOJ1
{
    public static void Main()
    {
        while (true)
        {
            string Input = Console.ReadLine();
            if (Input == null) break;
            string[] str = new string[3];
            int i = 0;
            while (i < Input.Length && Input[i] != '+') str[0] += Input[i++];
            ++i; // '+' 
            while (i < Input.Length && Input[i] != '=') str[1] += Input[i++];
            ++i; // '='
            while (i < Input.Length) str[2] += Input[i++];
            int ans = 0;
            for (; ans <= 9; ans++)
            {
                string[] STR = new string[3];
                for (int j = 0; j < 3; j++)
                {
                    for (i = 0; i < str[j].Length; i++)
                    {
                        if (str[j][i] == 'X') STR[j] += (char)('0' + ans);
                        else STR[j] += str[j][i];
                    }
                }
                if ((STR[0].Length >= 2 && STR[0][0] == '0')
                    || (STR[1][0] == '0' && STR[1].Length >= 2)
                    || (STR[2][0] == '0' && STR[2].Length >= 2)) continue;
                bool flag = false; // 繰り上げ
                string TMP = "";
                for (i = 0; i < 2; i++)
                {
                    TMP = "";
                    for (int j = STR[i].Length - 1; j >= 0; j--) TMP += STR[i][j];
                    STR[i] = TMP;
                }
                TMP = "";
                for (i = 0; i < Math.Max(STR[0].Length, STR[1].Length); i++)
                {
                    char ch = '0', CH = '0';
                    if (i < STR[0].Length) ch = STR[0][i];
                    if (i < STR[1].Length) CH = STR[1][i];
                    int sum = (ch - '0') + (CH - '0');
                    if (flag) { sum++; flag = false; }
                    if (sum >= 10) { flag = true; sum -= 10; }
                    TMP += (char)('0' + sum);
                }
                if (flag) TMP += '1';
                string rTMP = "";
                for (i = TMP.Length - 1; i >= 0; i--) rTMP += TMP[i];
                if (rTMP == STR[2]) break;
            }
            if (ans > 9) Console.WriteLine("NA");
            else Console.WriteLine(ans);
        }
    }
}