题目描述
对于一个数大于等于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
- 这个题目穷举就可以解决,升序排序数字,转成数字,降序排序数字,转成数字,然后相减,得到一个新的数,再循坏往下。
- 优化一下,先排序,再逆序。值得注意的一点是一定是要先排降序转成数字,再逆序。如果先排升序,那么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);
}