AOJ 0110 - Alphametic

楽?いや楽ではない問題.
40桁を超える数が入ってくる場合があるからです.
そのため多倍長に対応したものを書きましたが
Wrong Answerだったので条件をよく見ると

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

つまり,1桁の時は捨てちゃダメ!っていうことだった.
そこまで配慮して書いたコード.

#include <iostream>
#include <sstream>
#include <algorithm>

std::string itos(int i){
  std::stringstream ss;
  ss<<i;
  
  return ss.str();
}

std::string Xtoi(std::string s,int i){
  std::string t = s;
  int find;
  while(find = t.find("X"),find != std::string::npos){
    t.replace(find,1,itos(i));
  }

  return t;
}

//multiple-recision computation
std::string mpc(std::string a, std::string b){
	int n[50] = {0};
	std::reverse(a.begin(),a.end());
	std::reverse(b.begin(),b.end());

	for(int i=0;i<a.size();i++){
		n[i] = a[i] - '0';
	}
	for(int j=0;j<b.size();j++){
		n[j] += b[j] - '0';
	}
	for(int k=0;k<50;k++){
		if(n[k] >= 10){
			n[k] -= 10;
			n[k+1]++;
		}
	}
	int digit = 0;
	for(int l=49;l>=0;l--){
		if(n[l]){digit = l;break;}
	}
	
	std::string res = "";
	for(int i=0;i<=digit;i++){
		res = itos(n[i]) + res;
	}

	return res;
}

int main(){
  std::string s;

  while(std::cin>>s,!std::cin.eof()){
    int p = s.find("+"),e = s.find("=");
    std::string a = s.substr(0,p),b = s.substr(p+1,e-p-1),c = s.substr(e+1,s.size()-e-1);

    int x0 = (!(a.find("X")) && a.size() > 1) || (!(b.find("X")) && b.size() > 1) || (!(c.find("X")) && c.size() > 1);

    int res = -1;
    for(int i=x0;i<=9;i++){
			std::string t_a = Xtoi(a,i), 
				t_b = Xtoi(b,i), 
				t_c = Xtoi(c,i);
      if(!t_c.compare(mpc(t_a,t_b))){res = i;break;}
    }

    if(res>=0)std::cout<<res<<std::endl;
    else{std::cout<<"NA"<<std::endl;}
  }
}

多倍長はJavaあたりが有利だったような気がするのでこういう問題は嫌だ.