AOJ : 0233 - 図書整理 (Book Arrangement)

問題概要

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0233&lang=jp
日本語なので, 問題の説明は省略です.

アルゴリズム

下位桁から順番に-10進数を作成していけば解けます.
ただし, 途中繰り上がり処理等を書かなければいけない箇所があるため, 注意が必要です.

プログラム

typedef long long ll;
string itos(ll x){stringstream ss;ss<<x;return ss.str();};

int main(void){
  ll x;

  while(cin>>x,x){
    bool flg = false;
    if(x < 0){
      flg = true;
      x = -x;
    }
    string s = itos(x);
    ll ans = 0;
    ll p = 1;

    //下位桁から順番に見ていく
    for(int i=0;i<s.length();i++,p*=10){
      ll digit = s[s.length()-i-1] - '0';

      //0は無視
      if(digit == 0) continue;

      if(i % 2 == 0 && !flg || i % 2 == 1 && flg){
        ans += digit * p;

        //繰り上げ処理
        if(ans >= p*10){
          ll tmp = ans / (p*10);
          ans = ans % (p*10) + (20 - tmp) * p * 10;
        }
      }
      else{
        ans += (20 - digit) * p;

        //繰り上げ処理
        if(ans >= p*20){
          ans -= p*20;
        }
      }
    }
    cout<<ans<<endl;
  }

  return 0;
}