1019デジタルブラックホール(20ポイント)-テストポイント5

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;
}

おすすめ

転載: blog.csdn.net/qq_41962612/article/details/114683870