落とし穴:まさかの多倍長
多倍長マジ死ぬべき。先輩に言われるまで気づかなかった。何でWrong出るのか分からなかった。
スパゲッティソース、pls()で簡易多倍長足し算してる。筆算の仕組み。効率的な書き方誰か教えて。
#include<iostream> #include<vector> #include<algorithm> using namespace std; string pls(string a,string b) { string ret; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); if(a.size()<b.size())swap(a,b); while(b.size() !=a.size() )b+='0'; while(ret.size()!=a.size()+1)ret+='0'; for(int i=0;i < a.size(); i++){ ret[i] = a[i] + b[i] + ret[i] - '0'*3; if(ret[i]>9){ ret[i] = '0' + ret[i]%10; ret[i+1] = '1'; }else{ ret[i]= '0' + ret[i]; } } reverse(ret.begin(),ret.end()); if(~ret.find_first_not_of('0'))return ret.substr(ret.find_first_not_of('0'),ret.size()-ret.find_first_not_of('0')); else return "0"; } bool func(vector<string> f , int n) { for(int i=0;i<3;i++){ for(int j=0;j<f[i].length();j++){ if(f[i][j]=='X'){ f[i][j]='0'+n; } } } return ( pls(f[0],f[1]) == f[2] ); } int main() { bool flag; int ret; vector<string> m; string s,t; while(cin >> s){ s+=" "; m.clear(); flag = false; ret = -1; for(int i=0;i<s.length();i++){ if(s[i]>='0' && s[i]<='9' || s[i]=='X'){ t+=s[i]; }else{ if(t.size()>=2 && t[0] == 'X')flag = true; m.push_back(t); t.clear(); } } for(int i=(flag?1:0);i<10;i++){ if(func(m,i))ret=i; } if(~ret)cout << ret << endl; else cout << "NA" << endl; } }