冒泡排序的应用——6174问题

冒泡排序的应用——6174问题


  • 问题叙述:

       输入一个n位数,把所有数字从大到小排序后得到a,从小到大排序得到b,用a-b替换原来的数,并继续操作,直到出现循环,即新得到的数曾经得到过。如:初始为1234,依次可得4321-1234=3087、8730-378=8352、8352-2358=6174、而7641-1267=6174,即回到本身。

  • 问题分析及解决:

       不难看出,我们需要解决两个问题,如何得到下一个数?如何判断这个数是否出现过?需要得到下一个数,就要解决各个数字排序问题,这也是我们今天重点应用的排序算法——冒泡排序。代码如下:

int get_number(int x)
{
	int a, b, n;
	char p[10];
	//转化成字符串
	sprintf(p, "%d", x);
	n = strlen(p);    
	//冒泡排序
	for(int i = 0; i < n; i++)
		for(int j = i+1; j < n;j++)
			if (p[i] > p[j])
			{
				char t = p[i];
				p[i] = p[j];
				p[j] = t;
			}
	sscanf(p, "%d", &b);
	//反转即倒序输出
	for (int i = 0; i < n / 2; i++)
	{
		char t = p[i];
		p[i] = p[n-1-i];
		p[n-1-i] = t;

	}
	sscanf(p, "%d", &a);
	return a - b;
}

逐一生成各个数,并判断是否生成过,这里我们使用最常用的数组进行存储,代码如下:

int num[2000], count;
int main()
{
	scanf("d", &num[0]);
	printf("d", num[0]);
	count = 1;
	for (;;)
	{
		//生成并输出下一个数
		num[count] = get_number(num[count - 1]);
		printf("->%d", num[count]);
		//在数组中寻找新生成的数
		int found = 0;
		for(int i = 0; i< count; i++)
		{
			if (num[i] == num[count])
			{
				found = 1;
				break;
			}
		}
		//若找到,退出循环
		if (found)
			break;
		count++;
	}
	printf("\n");
	return 0;
}

冒泡排序一直由于其简洁的思想方法而倍受青睐,但也有其不足,这就需要我们对算法进行优化,以后会更新的哦&&&

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值