C语言验证黑洞数6174

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数字黑洞,这个黑洞很厉害?。 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值