给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个(0, 10000)区间内的正整数N。
输出格式:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。
输入样例1:6767输出样例1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174输入样例2:
2222输出样例2:
2222 - 2222 = 0000
//
// main.cpp
// PAT
//
// Created by Grover Chen on 10/4/14.
// Copyright (c) 2014 Grover Chen. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <math.h>
#include <string>
using namespace std;
int main()
{
int N,a[4];
int small, large, result;
int times=0;
int cmp(const void *a, const void *b);
cin>>N;
result=N;
while (result!=6174 || times==0)
{
a[0]=result/1000;
a[1]=(result-a[0]*1000)/100;
a[2]=(result-a[0]*1000-a[1]*100)/10;
a[3]=result%10;
if (a[0]==a[1] && a[1]==a[2] && a[2]==a[3]) {
cout<<result<<" - "<<result<<" = 0000";
break;
}
qsort(a, 4, sizeof(int), cmp);
small=1000*a[0]+100*a[1]+10*a[2]+a[3];
large=1000*a[3]+100*a[2]+10*a[1]+a[0];
result=large-small;
if (small>=1000 && small<=9999) {
if (result/1000==0) {
cout<<large<<" - "<<small<<" = 0"<<result;
}
else
cout<<large<<" - "<<small<<" = "<<result;
}
else if (small<=999 && small>=100) {
if (result/1000==0) {
cout<<large<<" - 0"<<small<<" = 0"<<result;
}
else
cout<<large<<" - 0"<<small<<" = "<<result;
}
else if (small<100 && small>=10){
if (result/1000==0) {
cout<<large<<" - 00"<<small<<" = 0"<<result;
}
else
cout<<large<<" - 00"<<small<<" = "<<result;
}
else{
if (result/1000==0) {
cout<<large<<" - 000"<<small<<" = 0"<<result;
}
else
cout<<large<<" - 000"<<small<<" = "<<result;
}
if (result!=6174) {
cout<<endl;
}
times+=1;
}
return 0;
}
int cmp(const void *a, const void *b)
{
return *(int*)a-*(int *)b;//升序排序
}
注意事项:
1.输入为6174时需要额外进行判断
2.无论是被减数还是结果,不足四位都需要在前面补0使其成为四位方可AC
3.对qsort的使用仍不是很熟练,尤其是在cmp部分上。
//针对int类型数组的cmp,char类型、double类型都类似
int cmp(const void *a, const void *b)
{return *(int*)a-*(int *)b;}//升序排序
//针对结构体数据类型的cmp(结构体名称为In)
int cmp( const void *a ,const void *b)
{return (*(In *)a).data > (*(In *)b).data ? 1 : -1;}
qsort的函数原型如下:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )
参数意义如下:
第一个参数 base 是 需要排序的目标数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式)
第二个参数 num 是 参与排序的目标数组元素个数
第三个参数 width 是单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0])这样的表达式