问题的描述:
假设你有一个数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大排序得到b,然后用a-b
替换原来这个数字,并且继续操作,直到出现循环(就是得到的新的数字原来出现过),输入保证在循环之前最多只会
产生1000个整数.
思想 : 在写这个题的时候虽然我有思路,但是我的思路不是很清楚,所以我采用了画图法,不过画个图看起来
非常的清楚啊,准备以后都使用这样的方法,但是画图的过程中我发现,最好使用顺序结构,不要在图中出现循环,
这样做,是保证了程序的清晰,也保证了程序执行效率,我一开始画的图非常的复杂,但是我把答案的图画出来,十分的
简单,清晰,一看就懂.(本人强烈推荐,使用画图法解决这类问题)
/*
** 6174 问题
** 1.输入这个数字,这个程序就是进行一次的输入,并输出
** 2.转化出下一个数字,并输出,判断一下这个数字是否出现过
** 3.出现过,break,没有出现过,再次循环
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int next_array( char buf[], int len ){
int i = 0,j = 0;
for(i = 0; i < len; i++){
for(j = i+1; j < len; j++){
if(buf[i] > buf[j]){
char temp = buf[i];
buf[i] = buf[j];
buf[j] = temp;
}
}
}
int num1 = 0;
// printf( "buf = %s\n", buf);
sscanf( buf, "%d", &num1);
char temp = buf[0]; buf[0] = buf[len-1]; buf[len-1] = temp;
temp = buf[1]; buf[1] = buf[len-2]; buf[len-2] = temp;
int num2 = 0;
sscanf( buf, "%d", &num2);
// printf( "buf = %s\n", buf);
return num2 - num1;
}
int main( void ){
int num = 0;
int count = 0;
int Array[2000] = {};
char buf[10] = {};
int i = 0,j = 0;
int ok = 0;
scanf( "%d", &num );
printf( "%d", num );
while( 1 ){
ok = 0;
Array[count++] = num;
sprintf( buf, "%d", num );
num = next_array( buf, strlen(buf) );
printf( " -> %d" , num);
for( i = 0; i < count; i++){
if( num == Array[i] ){
ok = 1;
}
}
if( ok ) break;
}
printf( "\n" );
return 0;
}