2012 ICPC国内予選B問題
B問題
これも実装ゲー
でもやはりまだstr,char配列からintの扱いが苦手かも
#include<iostream>
#include<map>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
typedef pair<bool,int> P; // i,j
int main(){
int L,ans;
int ii=1;
string An;
char change[1000000];
string a0;
map<int,P> Index;
int val[20],maxval[20],minval[20];
while(true){
cin >> a0 >> L;
if(a0 == "0" && L == 0)break;
Index.clear();
ii=1;
for(int i=0;i<L;i++){
if(a0.length() > i){
val[i] = a0[i]-'0';
}
else val[i] = 0;
}
for(int i=0;i<L;i++){
maxval[i]=minval[i]=val[i];
}
int A0 = atoi(a0.substr(0,a0.length()).c_str());
Index[A0] = P(true,0);
while(true){
sort(maxval,maxval+L,greater<int>());
sort(minval,minval+L);
int A=0,B=0; // A = min . B = max
int ind=L-1;
for(int i=0;i<L;i++){
A += maxval[i]*pow((double)10,i);
B += minval[i]*pow((double)10,i);
}
int IND = B-A;
if(!Index[IND].first){
Index[IND] = P(true,ii);
}
else {
cout << Index[IND].second << " " << IND << " " << ii - Index[IND]
.second << endl;
break;
}
ii++;
sprintf(change,"%d",IND);
An.clear();
An.append(change);
for(int i=0;i<L;i++){
if(An.length() > i){
val[i] = An[i]-'0';
}
else val[i] = 0;
}
for(int i=0;i<L;i++){
maxval[i]=minval[i]=val[i];
}
}
}
return 0;
}