6174问题

题目:

输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数

并且继续操作。例如从1234 出发,4321-1234=3087、8730-378=8352、8532-2358=6174 7641-1467=6174,回到了它自己。

输入一个n位数,输出操作序列,直到出现循环(即新得到的数曾经得到过),保证在循环之前最多只会产生1000个整数。

样例输入:1234

样例输出:1234->3087->8352->6174->6174

思路:先要把各个数据排序,得到两个数的差作为下一个输入的数,因为这个过程会多次利用,所以最好写成函数。第二步逐步生成各个数,并判断该数是否出现过,最常用的是数组。

另外需注意,此时涉及到一个字符串反转问题,不要直接用strrev函数解决,因为不是ANSIC的,该种方法是最简便易行的,需要记住。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 5000

int get_next(int x)    //获取下一个字符,可是输入的是数字,要用sscanf换成字符的格式, 
{
	char f[5];
	int a,b;
	sprintf(f, "%d", x);   //sprintf的作用是将数字变量转换成字符串 
	int n = strlen(f);
	for(int i = 0; i < n; i++)   //冒泡排序后得到的数为递增排列 ,所以得到的数值为小的! 
	for(int j = i + 1; j < n ; j++)
	if(f[i]>f[j])
	{
		char s = f[i];
		f[i] = f[j];
		f[j] = s; 
	} 
	sscanf(f , "%d", &a);  //sscanf的作用是从字符串中取出其他格式的数据放到变量a中
	
	for(int i = 0; i < n/2 ; i++)    //字符串反转,即将字符串的顺序倒过来 
	{
		char t = f[i];
		f[i] = f[n-1-i];
		f[n-1-i] = t;
	} 
	                               
	sscanf(f, "%d", &b);  //存到数值b中
	return ( b - a); 
}
int main()
{
	int num[MAXN],count = 1;
	scanf("%d", &num[0]);  
	printf("%d", num[0]);
	
	for( ; ; )
	{
		num[count] = get_next(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;
}



你可能感兴趣的:(解题报告,排序与检索)