Cool Number

马德宇
2023-12-01

题目描述

对于一个数大于等于0的数X,我们定义三个函数,g1(x),g2(x),f(x)

g1(x) = 让x的所有数字从大到小排列(比如123变成321)

g2(x) = 让x的所有数字从小到大排列(比如321变成123)

f(x) = g1(x) - g2(x)

我们给定两个数N和K,让你算出N,f(N)经过K次运算后是多少?

输入

第一行输入两个数N(1<=N<=1e9),K(1<=k<=1e5)

输出

一个数f(N)

样例输入 复制

314 2

样例输出 复制

693

 

  1. 这个题目穷举就可以解决,升序排序数字,转成数字,降序排序数字,转成数字,然后相减,得到一个新的数,再循坏往下。
  2. 优化一下,先排序,再逆序。值得注意的一点是一定是要先排降序转成数字,再逆序。如果先排升序,那么0就会排到前面去,转成逆序数字时就会出错。

代码如下:

#include<stdio.h>
long long g1(long long m)//求
{
	long long i=0,j,t,a[20],n;
	long long s=0,k=m;
	while(k)
	{
		a[i++]=k%10;
		k/=10;
	}
	n=i;
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(a[j]>a[j-1])
			{
				t=a[j];a[j]=a[j-1];a[j-1]=t;
			}
		}
	}
	for(i=0;i<n;i++)
	{
		s=s*10+a[i];
	}
	return s;
	
}
long long fs(long long n)
{
	long long a=n,s=0;
	while(a)
	{
		s=s*10+a%10;
		a/=10;
	}
	return s;
}

int main()
{
	long long n,k,i;
	long long a,b,s;
	scanf("%lld%lld",&n,&k);
	s=n;
	while(k--)
	{
		a=g1(s);
		b=fs(a);
		s=a-b;
	}
	printf("%lld\n",s);
}                                                                                                                                                                                                                                                                                                                                                                      

 类似资料:

相关阅读

相关文章

相关问答