2013年11月10日日曜日

多倍長なヤツ

何か、あると便利じゃね?という妄想から実装しました。


足し算


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 件のコメント:

コメントを投稿