1019デジタルブラックホール(20ポイント)
桁が完全に同じではない4桁の正の整数が与えられた場合、最初に4桁を昇順ではなく並べ替え、次に降順ではなく並べ替えてから、最初の桁から2番目の桁を引くと次のようになります。新しいデジタルを入手してください。これを繰り返し行うと、すぐに「デジタルブラックホール」として知られる6174で停止します。この魔法の数は、カプレカーの定数とも呼ばれます。
たとえば、6767から開始すると、次のようになります。
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
4桁の正の整数が与えられたら、ブラックホールに到達するプロセスを示すプログラムを作成してください。
入力形式:
入力は1つ(0、1 0 4)(0,10 ^ 4)を与えます(0 、1 04)区間内の正の整数N。
出力形式:
Nの4桁がすべて等しい場合は、N-N = 0000を1行で出力します。それ以外の場合は、6174が差として表示されるまで、計算の各ステップを1行で出力します。出力形式の例を参照してください。各番号は4桁の形式で出力されることに注意してください。
入力例1:
6767
出力サンプル1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
入力例2:
2222
出力サンプル2:
2222 - 2222 = 0000
回答
この質問の意味は、4桁の数値を前後に計算して各数値を分離し、最大値から最小値を引いたものを組み合わせて、同じ2つの数値の差が0または6174になるまでループすることです。
最大数を見つけるためにソートした後、最小値を逆にすることができます。
big関数は4桁を分割し、バケットに並べ替えます。大きな数の合計から始めて、新しい4桁の最大数
が結合されます。small関数はbig関数の戻り値の逆数を取ります。
注:テストポイント5が異常である場合は、入力n = 6174が考慮されていないことを意味し、出力は次のようになります。
7641 - 1467 = 6174
違いのため、null値の代わりに。
ACルーチン
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<algorithm>
#include<set>
using namespace std;
int big(int n)
{
int a=n/1000,b=n%1000/100,c=n%100/10,d=n%10;
int m[10];memset(m,0,sizeof(m));
int sum=0;
m[a]++;m[b]++;m[c]++;m[d]++;
for(int i=9;i>=0;)
{
if(m[i]>1){
sum=sum*10+i;m[i]--;}
else if(m[i]==1){
sum=sum*10+i;i--;}
else i--;
}
return sum;
}
int small(int n)
{
return n/1000+n%1000/100*10+n%100/10*100+n%10*1000;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,a,b;
cin>>n;
if(n==6174)
{
a=big(n);b=small(a);n=a-b;
printf("%04d - %04d = %04d\n",a,b,n);}
while(n!=0&&n!=6174)
{
a=big(n);b=small(a);n=a-b;
printf("%04d - %04d = %04d\n",a,b,n);
}
return 0;
}