PAT 乙级 1019 数字黑洞

PAT 乙级 1019 数字黑洞_第1张图片

PAT 乙级 1019 数字黑洞_第2张图片

解法思路,我用c语言和python 做了这道题,这里面有一个小坑就是没说一定是4位整数,有可能是3位,2,1,位,用python排序时候需要注意,我c语言用的hash反而无所谓。。代码如下:

c语言代码:

#include
#include
#include
int f_max(int count[])
{
	int i,count_c[10],max=0,mont=0;
	memcpy(count_c,count,sizeof(count_c));
	for(i=9;i>=0;i--)
	{
		if(count_c[i]!=0)
		{
			while(count_c[i])
			{
				max=max*10+i;
				count_c[i]--;
				mont++;
			}			
		}		
	}
	if(mont!=4)
	{
		for(i=0;i<4-mont;i++)
		max=max*10;
	}
	return max;
}
int f_min(int count[])
{
	int i,count_c[10],min=0;
	memcpy(count_c,count,sizeof(count_c));
	for(i=0;i<10;i++)
	{
		if(count_c[i]!=0)
		{
			while(count_c[i])
			{
				min=min*10+i;
				count_c[i]--;
			}	
		}		
	}
	return min;
}
int count_f(int n,int count[])
{
	while(n)
	{
		count[n%10]++;
		n=n/10;
	}
	return 1;
}
int main()
{
	int n,count[10]={0};
	scanf("%d",&n);
    if(n%1111==0)
    printf("%04d - %04d = %04d\n",n,n,0);
    else
    {
	int output=0,max,min;
	while(output!=6174)
	{
		memset(count,0,sizeof(count));
		count_f(n,count);
		max=f_max(count);
		min=f_min(count);
		output=max-min;
		n=output;
		printf("%04d - %04d = %04d\n",max,min,output);
	}
    }
	return 0;
 } 

python代码:

s=list(input())
while(len(s)<4):
    s.insert(0,'0')        
if (s.count(s[0])==4):
    s=eval(''.join(s))
    print('{0:04} - {0:04} = {1:04}'.format(s,s-s))
else :
    output=0
    while(output!=6174):
        s_max=int(''.join(sorted(s,reverse=True)))
        s_min=int(''.join(sorted(s)))
        output=s_max-s_min
        s=str(output)
        if(len(s)<4):
            s='0'+s
        print('{0:04} - {1:04} = {2:04}'.format(s_max,s_min,output))
    
    

PAT 乙级 1019 数字黑洞_第3张图片

你可能感兴趣的:(pat考试,c语言,python)