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;
using System.Linq;
using System.Text;

namespace _0110
{
    public class Program

    {
        public static void Main(string[] args)
        {
            while (true)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line)) return;

                bool flg = false;
                for (int i = 0 ; i < 10 ; i++)
                {

                    string tmp = line;
                    tmp = tmp.Replace("X", i.ToString());

                    string[] items = tmp.Trim().Split("+=".ToCharArray());
                    if (items.Any(x => x[0] == '0' && x.Length > 1)) continue;

                    if (Sum(items[0], items[1]) == items[2])
                    {
                        Console.WriteLine(i);
                        flg = true;
                        break;
                    }
                }
                if(!flg) Console.WriteLine("NA");
            }

        }

        public static string Sum(string a , string b)
        {
            const int N = 126;
            a = string.Join("", a.PadLeft(N, '0').Reverse());
            b = string.Join("", b.PadLeft(N, '0').Reverse());

            string[] resAr = new string[N];
            bool carrying = false;
            for (int j = 0 ; j < resAr.Length ; j++)
            {
                string tmp = (int.Parse(a[j].ToString()) + int.Parse(b[j].ToString()) + (carrying ? 1 : 0)).ToString();
                resAr[j] = tmp.Substring(tmp.Length - 1, 1);
                carrying = (int.Parse(tmp) > 9) ? true : false;
            }

            string ans =  string.Join("", resAr.Reverse().SkipWhile(x => x == "0").ToArray());
            return ans == "" ? "0" : ans;

        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}