冒泡排序的应用——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;
}
冒泡排序一直由于其简洁的思想方法而倍受青睐,但也有其不足,这就需要我们对算法进行优化,以后会更新的哦&&&