题目大意:
给定任意一个各位数字不完全相同的四位正整数,如果先把四个数字按非递增排序,再按非递减排序,然后用第一个数字减第二个数字,将得到一个新的数字。重复这一操作,很快会停在有“数字黑洞”之称的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考察。
提交结果:
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。