0x00 问题描述
问题简述:任意选一个四位数(数字不能全相同),把所有数字从大到小排列,再把所有数字从小到大排列,用前者减去后者得到一个新的数。重复对新得到的数进行上述操作,7步以内必然会得到6174。
0x01 代码设计
C语言代码如下,输入要测试的次数,随机选取四个数字保存到数组,然后正序逆序排序分别放入两个数组,使用数组间运算产生新的数组,最终验证数字黑洞。
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
int testNum(int *a) //测试产生的数是否为2222\6666类似的数字
{
int i, j = 3;
for(i=1; i<4; ++i)
if (a[0] == a[i])
--j;
else
return j;
return j;
}
void Maxpx(int *num, int *max)// 返回从大到小排列的数组,冒泡排序
{
int i, j, k;
for (i=0; i<4; ++i)
max[i] = num[i];
for(i=0; i<4; ++i)
for(j=0; j<4-i-1; ++j)
{
if(max[j] < max[j+1])
{
k = max[j];
max[j] = max[j+1];
max[j+1] = k;
}
}
}
void Minpx(int *num, int *min)// 返回从小到大排列的数组
{
int i, j, k;
for (i=0; i<4; ++i)
min[i] = num[i];
for(i=0; i<4; ++i)
for(j=0; j<4-i-1; ++j)
{
if(min[j] > min[j+1])
{
k = min[j];
min[j] = min[j+1];
min[j+1] = k;
}
}
}
void arrDec(int *a, int *b, int *c)// 数组减法,数组元素进行减法运算,包含借位运算
{
int jw = 0, n = 3;
int na = 0, nb = 0, nc = 0;
int i, j, k;
while(n>=0)
{
if (a[n] > b[n])
{
if(jw == 1)
{
jw = 0;
a[n]--;
}
c[n] = a[n] - b[n];
n--;
}
else
{ if (n==3)
c[n] = 10 - b[n] + a[n];
else
c[n] = 9 - b[n] + a[n];
n--;
jw = 1;
}
}
for(i=0, k=1; i<4; ++i) //校验结果
{
k = k*10;
na = a[3-i]*k;
nb = b[3-i]*k;
nc = c[3-i]*k;
}
if (nc != na - nb)
printf("运算出错!\n");
}
int main(void)
{
int num[4], max[4], min[4]; //数组存放操作数
int i, j, k;
int n, m, l = 0;
printf("请输入测试的组数:");
scanf("%d", &n);
srand((unsigned)time(NULL));//置随机数种子
for(m=1; m<=n; m++)
{
printf("---------------------第%d组--------------------:\n", m);
do
{
printf("原数字:");
for(i=0; i<4; ++i)
{
num[i] = rand()%10;
printf("%d", num[i]);
}
printf("\n");
}while(!testNum(num));
for (k=7; k>0; --k)//循环7次,题目要求
{
printf("从大到小排序:");
Maxpx(num, max);
for(i=0; i<4; ++i)
printf("%d", max[i]);
printf("\n");
printf("从小到大排序:");
Minpx(num, min);
for(i=0; i<4; ++i)
printf("%d", min[i]);
printf("\n");
printf("新数组为:");
arrDec(max,min,num);
for(i=0; i<4; ++i)
{
printf("%d", num[i]);
}
printf("\n");
if(num[0]==6 && num[1]==1 && num[2]==7 && num[3]==4)
{
printf("验证成功\n");
l++;
break;
}
}
}
if(l==n)
printf("------------所有测试组全部陷入黑洞!------------\n");// 所有的测试最终全收敛与6174则显示本语句!
else
printf("%d\n", l);
return 0;
}
0x02 运行测试
运行测试1:测试2组
运行测试2:测试50组
运行测试3:测试5000组 (约运行35.78秒)
0x03 结论
结论:经过验证,所有测试组全部跌入6174数字黑洞,这个黑洞很厉害?。