PAT-B1019 数字黑洞 JAVA&&C

1019 数字黑洞 (20 分)

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

例如,我们从6767开始,将得到

 

现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个 (0,10^​4​​) 区间内的正整数 N。

输出格式:

如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。

 

一、JAVA实现

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    
    static int[] createMin(int n){
        int[] returnArrays = new int[4];
        String A = Integer.toString(n);
        for(int i=0;i<4;i++){
            returnArrays[i] = A.charAt(i)-'0';  //字符串转整型数组
        }
        Arrays.sort(returnArrays);
        return returnArrays;
    }
    static int[] createMax(int n){
        int[] A = new int[4];
        A = createMin(n);
        for(int i=0;i<=1;i++){
            int temp = A[i];
            A[i] = A[3-i];
            A[3-i] = temp;
        }
        return A;
    }
    static int jian(int[] max,int[] min){
        int minNumber=0,maxNumber=0;
        for(int i=0;i<4;i++){
            minNumber=minNumber*10+min[i];
            maxNumber=maxNumber*10+max[i];
        }
        int cha = maxNumber-minNumber;
        System.out.format("%04d - %04d = %04d\n",maxNumber,minNumber,cha);
        return cha;
    }
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();  //存储初始数字
        if(number%1111==0){
            System.out.format("%04d - %04d = 0000",number,number);
            System.exit(0);
        }
        int[] max = new int[4];
        int[] min = new int[4];
        int cha  = number;//进入循环后再变为减数和被减数
        do{
            if(cha>=100&&cha<=999) cha*=10;  //3位变4位
            else if(cha>=10&&cha<=99) cha*=100;  //2位变4位
            else if (cha>=1&&cha<=9) cha*=1000;  //1位变4位
            //目前cha必为4位,转化为最大和最小数
            min = createMin(cha);
            max=  createMax(cha);
            cha = jian(max,min);
        }while(cha!=6174);
    }
}

 

二、C实现

#include<stdio.h>
#include<string.h>
int main()
{
    int sortMax(int[]);
    int sortMin(int[]);
    int number;
    scanf("%d",&number);
    if(number%1111==0){
        printf("%d - %d = 0000\n",number,number);
        return 0;
    }
    int A[4];
    int B[4];
    int max=0;
    int min=0;
    int cha=number;
    do{
        if(cha>=1&&cha<=9) cha*=1000;
        else if(cha>=10&&cha<=99) cha*=100;
        else if(cha>=100&&cha<=999) cha*=10;
        for(int i=3;i>=0;i--){
            B[i]=A[i]=cha%10;
            cha/=10;
        }
        max = sortMax(A);
        min = sortMin(B);
        cha = max-min;
        printf("%04d - %04d = %04d\n",max,min,cha);
    }while(cha!=6174);
}

int sortMax(int A[]){
    for(int i=0;i<4;i++){
        for(int j=0;j<3-i;j++){
            if(A[j]<A[j+1]){
                int temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    }
    int sum = 1000*A[0]+100*A[1]+10*A[2]+A[3];
    return sum;
}

int sortMin(int A[]){
    for(int i=0;i<4;i++){
        for(int j=0;j<3-i;j++){
            if(A[j]>A[j+1]){
                int temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    }
    int sum = 1000*A[0]+100*A[1]+10*A[2]+A[3];
    return sum;
}

 

本体需要注意:

区分形如“666”和“6666”的情况。前者需要补0成4位,后者4位数字相同直接输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值