川のブログ

川の適当気ままなブログです。 

AOJ 0259 All Numbers Lead to 6174

こんにちは川です。

今回は特に解説はないです。

 

文字列で受け取る -> 配列に入れなおします。

6174が出るまで

ソート -> 変数一つに入れなおす -> 引き算 -> 比較 ->

配列に入れ直し ー>

 

という順序でやってますね。

 

感想としては、sort関数とpow関数の精度が

急におかしくなったことでイライラしました。

結果、自分でコードを書きました。

 

あとやり方が汚くなっているのでそこを直したい。

 

ソースコード

 

#include<bits/stdc++.h>
using namespace std;
 
int power(int n)
{
    int num=1;
    for(int i=0;i<n;i++)num*=10;
    return num;
}
int main()
{
    string str;
    int ans=6174;
    while(cin>>str&&str!="0000"){
        int up[4],down[4];
        if(str!="6174"){
            for(int i=0;i<4;i++)up[i]=str[i]-'0';
            bool kawa=0;
            for(int i=1;!kawa;i++){
                for(int j=0;j<4;j++){
                    for(int k=3;k>j;k--)if(up[k]<up[k-1])swap(up[k],up[k-1]);
                }
                for(int j=0;j<4;j++)down[j]=up[3-j];
                int num[2]={};
                for(int j=0;j<4;j++){
                    num[0]+=down[j]*power(3-j);
                    num[1]+=up[j]*power(3-j);
                }
                num[0]-=num[1];
                if(num[0]==ans||num[0]==0){
                    if(num[0]==0)cout<<"NA\n";
                    else cout<<i<<endl;
                    kawa=1;
                }
                up[0]=num[0]/1000;
                up[1]=num[0]%1000/100;
                up[2]=num[0]%100/10;
                up[3]=num[0]%10;
            }
        }
        else cout<<"0\n";
    }
}