日々精進

aikoと旅行とプログラミング

【AOJ 1180】Recurring Decimals

問題

繰り返す10進数 | Aizu Online Judge

ソースコード

#include <iostream>
#include <string>
#include <map>
#include <algorithm>

using namespace std;

#define rep(i,n) for(int i = 0 ; i < n ; i++)
string zero(string s, int l){
  while(s.length() < l){
    s = "0" + s;
  }

  return s;
}

int flag[1000001];

int main(){
  string in;
  int l;
  while(true){
    cin >> in >> l;
    if(l==0) break;
    in = zero(in,l);
    fill(flag, flag+1000001, -1);
    flag[stoi(in)] = 0;
    for(int i = 1 ; i <= 20 ; i++){
      sort(in.begin(), in.end());
      string max = string(in.rbegin(), in.rend());
      string min = string(in.begin(), in.end());
      string ans = to_string(stoi(max) - stoi(min));
      ans = zero(ans,l);
      if(flag[stoi(ans)]>-1){
        cout << flag[stoi(ans)] << " " << stoi(ans) << " " << i-flag[stoi(ans)] << '\n';
        break;
      }
      flag[stoi(ans)] = i;         
      in = ans;
    }
  }
}