2

题目大意:

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

算法思路:

此题直接按照题目的描述进行模拟就好,这里采用do...while循环的结果比较方便处理输入为0或者6174的情况,在循环体中,我们首先将数字N转化为数组a,然后将数组a的每一位从大到小排序,然后使用toIntFirst函数获取其数组对应的数字first,注意到将a从小到大排序后的结果实际上就是当前数组a逆序的结果,那么我们就没有必要再次对a进行排序,直接使用toIntSecond获取其逆序的数字second,再使用N保存first-second作为下一次循环的数字,最后按照要求输出即可,退出循环的条件就是N==6174或者N==0.

注意点:

1、输入为6174的时候得循环处理输出一次,测试点5考察。

提交结果:

截屏2020-10-23 上午10.07.01.png

AC代码:

#include <algorithm>
#include <cstdio>

using namespace std;

bool cmpByDesc(int a,int b){
    return a>b;
}

int toIntFirst(const int a[]){
    int N = 0;
    for (int i = 0; i < 4; ++i) {
        N = N*10+a[i];
    }
    return N;
}

int toIntSecond(const int a[]){
    int N = 0;
    for (int i = 3; i >= 0; --i) {
        N = N*10+a[i];
    }
    return N;
}

int main(){
    int N;
    scanf("%d",&N);
    int a[4] ={};
    do{
        int num = 0;// a数组的指针
        // 首先将数字转化为数组
        while (N!=0){
            a[num++] = N%10;
            N /= 10;
        }
        // 从大到小排序
        sort(a,a+4,cmpByDesc);
        // 将数组转化为数字
        int first = toIntFirst(a);
        // 将数组逆置并转化为数字
        int second = toIntSecond(a);
        N = first-second;
        printf("%04d - %04d = %04d\n",first,second,N);
    }while (N!=6174&&N!=0);
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得