数字黑洞(PAT)

1. 题目描述:

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意4位正整数,请编写程序演示到达黑洞的过程。

2.输入描述:

输入给出一个(0, 10000)区间内的正整数N。

3.输出描述:

如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。

4.输入例子:

6767

5.输出例子:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

6.解题思路:

我开始提交运行的时候这道题测试点2和3总是内存超限,想了好久都无解,最后还是看了其他的博主的文章才知道测试点2和3的用例是个位数和百位数,可题目说“给定任一个各位数字不完全相同的4位正整数”,有点无语=.=,

1. 首先输入一个整数并将整数转化为字符串数组用于排序;
2. 对字符串数组进行递减排序,并将字符数组转化为整数x,输出该字符串数组;
3. 递增排序可以直接将原本的递减排序倒过来,然后转化为整数y;
4. 判断x-y是否为零,如果为零就输出结果;
5. 如果x-y不为零则将整数(x-y)转换为字符给原来的字符串数组;
6.如此循环直到x-y的结果为6174。

7.源代码:

#include<stdio.h>
int main()
{
	int i,j,x=0,y=0,num;
	char str[5]="\0",temp;
	scanf("%d",&num);
	str[0]=(num/1000)+48;
	str[1]=((num/100)%10)+48;
	str[2]=((num/10)%10)+48;
	str[3]=(num%10)+48;

	while((x-y)!=6174)
	{

		for(i=0;i<3;i++)
			for(j=0;j<3-i;j++)
				if(str[j]<str[j+1])
				{
					temp=str[j];
					str[j]=str[j+1];
					str[j+1]=temp;
				}
		x=(str[0]-48)*1000+(str[1]-48)*100+(str[2]-48)*10+str[3]-48;
		printf("%s - ",str);

		temp=str[0];
		str[0]=str[3];
		str[3]=temp;

		temp=str[1];
		str[1]=str[2];
		str[2]=temp;
		
		y=(str[0]-48)*1000+(str[1]-48)*100+(str[2]-48)*10+str[3]-48;

		if(x-y==0)
		{
			printf("%s = 0000",str);
			break;
		}
		printf("%s = %d\n",str,x-y);

		str[0]=((x-y)/1000)+48;
		str[1]=(((x-y)/100)%10)+48;
		str[2]=(((x-y)/10)%10)+48;
		str[3]=((x-y)%10)+48;
	}
	return 0;
}
全部评论

相关推荐

头像
03-18 09:09
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务