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;elsereturn 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];elsec[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则显示本语句!elseprintf("%d\n", l);return 0;}
0x02 运行测试
运行测试1:测试2组
运行测试2:测试50组
运行测试3:测试5000组 (约运行35.78秒)
0x03 结论
结论:经过验证,所有测试组全部跌入6174数字黑洞,这个黑洞很厉害?。