足し算
string TASHIZAN(string a,string b){ int maxlen = max(a.size(),b.size()) + 1; vector<int> ret(maxlen,0); string ans; reverse(a.begin(),a.end()), reverse(b.begin(),b.end()); for(int i = 0 ; i < a.size() ; i++ ) ret[i] = a[i] - '0'; for(int i = 0 ; i < b.size() ; i++ ) ret[i] += b[i] - '0'; for(int i = 0 ; i < maxlen - 1 ; i++ ){ ans += (ret[i] % 10) + '0'; ret[i+1] += ret[i] / 10; } if(ret[maxlen-1]) ans += ret[maxlen-1] + '0'; reverse(ans.begin(),ans.end()); return ans; }
引き算(マイナス判定も入れた)
bool Witch_big(string& a, string& b){ if(a == b) return true; if(a.size() > b.size()) return true; else if(a.size() < b.size()) return false; else return a > b; } string HIKIZAN(string a,string b){ bool minus = false; int maxlen = max(a.size(),b.size()), cnt = 0; vector<int> ret(maxlen,0); string ans; if(!Witch_big(a,b)) swap(a,b), minus = true; reverse(a.begin(),a.end()), reverse(b.begin(),b.end()); for(int i = 0 ; i < a.size() ; i++) ret[i] = a[i] - '0'; for(int i = 0 ; i < b.size() ; i++) ret[i] -= b[i] - '0'; for(int i = 0 ; i < maxlen ; i++){ while(ret[i] < 0) ret[i] += 10, ret[i+1]--; ans += ret[i] + '0'; } reverse(ans.begin(),ans.end()); while(ans[cnt] == '0' && cnt != ans.size() - 1) cnt++; return (minus ? "-" : "" ) + ans.substr(cnt); }
掛け算
string KAKEZAN(string a,string b){ int maxlen = a.size() + b.size(), cnt = 0; vector<int> ret(maxlen+1,0); string ans; reverse(a.begin(),a.end()), reverse(b.begin(),b.end()); for(int i = 0 ; i < a.size() ; i++) for(int j = 0 ; j < b.size() ; j++){ ret[i+j] += (a[i]-'0') * (b[j]-'0'); } for(int i = 0 ; i < maxlen ; i++){ ans += (ret[i] % 10) + '0'; ret[i+1] += ret[i] / 10; } reverse(ans.begin(),ans.end()); while(ans[cnt] == '0') cnt++; return ans.substr(cnt); }
除算は面倒臭かった()
0 件のコメント:
コメントを投稿