每日刷题(八十四)
题目描述
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
C++代码1
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b; //a>b时把a放在b前面
}
void to_array(int n, int num[]) //取出n的每一位并存到num数组中
{
for(int i = 0; i < 4; i++)
{
num[i] = n % 10;
n /= 10;
}
}
int to_number(int num[]) //将num数组转换为数字
{
int sum = 0;
for(int i = 0; i < 4; i++)
{
sum = sum * 10 + num[i];
}
return sum;
}
int main()
{
int n, MIN, MAX;
scanf("%d", &n);
int num[5];
while(1)
{
to_array(n, num);
sort(num, num + 4);
MIN = to_number(num);
sort(num, num + 4, cmp);
MAX = to_number(num);
n = MAX - MIN;
printf("%04d - %04d = %04d\n", MAX, MIN, n);
if(n == 0 || n == 6174) //%04d表示一共4位,位数不足的,左侧用0补齐
break;
}
return 0;
}
C++代码2
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
void to_array(int a[], int n)
{
for(int i = 0; i < 4; i++)
{
a[i] = n % 10;
n /= 10;
}
}
int to_number(int a[])
{
int sum = 0;
for(int i = 0; i < 4; i++)
{
sum = sum * 10 + a[i];
}
return sum;
}
int main()
{
int n;
cin >> n;
int a[4];
int MIN, MAX;
to_array(a, n);
while(true)
{
sort(a, a + 4);
MIN = to_number(a);
sort(a, a + 4, cmp);
MAX = to_number(a);
printf("%04d - %04d = %04d\n", MAX, MIN, MAX - MIN);
if(MAX - MIN == 0 || MAX - MIN == 6174)
break;
to_array(a, MAX - MIN);
}
return 0;
}
部分运行例子结果如下:
C++代码3
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a, int b) //递减排序
{
return a > b;
}
void to_array(int n, int a[]) //转化为数组便于排序sort
{
// while(n != 0) 必须确保数组a四个位都有
// {
// a[i++] = n % 10;
// n /= 10;
// }
for(int i = 0; i < 4; i++)
{
a[i] = n % 10;
n /= 10;
}
}
int to_digit(int a[]) //转换为数字便于subtract
{
int sum = 0;
for(int i = 0; i < 4; i++)
{
sum = sum * 10 + a[i];
}
return sum;
}
int main()
{
int n, minn, maxx;
cin >> n;
int a[4];
int num = 0;
while(1)
{
to_array(n, a);
sort(a, a + 4);
minn = to_digit(a);
sort(a, a + 4, cmp);
maxx = to_digit(a);
n = maxx - minn;
if(n == 0 || n == 6174)
{
printf("%04d - %04d = %04d\n", maxx, minn, n);
break;
}
printf("%04d - %04d = %04d\n", maxx, minn, n);
}
return 0;
}
部分样例运行结果:
如果按注释的写,样例的运行结果一致,但是当输入为3的时候就会严重报错!所以注释里的不对,要按红框框里的写!