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: Wrong Answer)

using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;

namespace AOJ2
{
    class Program
    {

        static void Main(string[] args)
        {
            List<string> resultList = new List<string>();

            string input;
            while ((input = Console.ReadLine()) != null)
            {

                int answer = 10;

                bool first = true;
                bool second = false;
                for (int i = 9; i >= 0; i--)
                {
                    string conv = input.Replace('X', i.ToString()[0]);
                    string[] param = conv.Split(new char[] { '+', '=' });

                    if (i == 0 && param.Where(s => s[0] == '0').Count() != 0)
                    {
                        continue;
                    }

                    int up = 0;

                    for (int j = 1; j <= param[2].Length; j++)
                    {
                        int kai = 0;

                        first = true;
                        if (param[0].Length < j && param[1].Length < j)
                        {
                            kai = up;
                        }
                        else if (param[0].Length < j)
                        {
                            kai = int.Parse(param[1][param[1].Length-j].ToString()) + up;
                        }
                        else if (param[1].Length < j)
                        {
                            kai = int.Parse(param[0][param[0].Length - j].ToString()) + up;
                        }
                        else
                        {
                            kai = int.Parse(param[0][param[0].Length - j].ToString()) + int.Parse(param[1][param[1].Length - j].ToString()) + up;
                        }

                        if (kai % 10 != int.Parse(param[2][param[2].Length - j].ToString()))
                        {
                            first = false;
                            break;
                        }
                        up = kai / 10;
                    }

                    if (first && !second)
                    {
                        answer = i;
                        second = true;
                    }
                    else if (first && second)
                    {
                        answer = 10;
                        break;
                    }

                }

                if (answer == 10)
                {
                    resultList.Add("NA");
                }
                else
                {
                    resultList.Add(answer.ToString());
                }

            }

            foreach (string s in resultList)
            {
                Console.WriteLine(s);
            }


        }
    }
}