首页 > 代码库 > 去重排序

去重排序

题目背景

一个简单的数学题。。。

题目描述

输入一个数N(N<=200位),拆分,得出最小的和最大的数列。

如: 123求出最小的=123

123求出最大的=321

再求出它们的差。

如: 321-123=?

若不是数字,直接输出NO

输入输出格式

输入格式:

 

第一行:输入一个数N(N<=200位)

 

输出格式:

 

输出看【题目描述】

 

输入输出样例

输入样例#1:
123
输出样例#1:
321-123=198
输入样例#2:
10
输出样例#2:
10-01=9
输入样例#3:
撒反对威锋网
输出样例#3:
NO

说明

对于%30的数据=<30位

对于%60的数据=<60位

对于%100的数据=<200位

 

思路:

  两遍排序,一遍减法,去掉前导0然后输出;

  有一个点是最大排列等于最小排列,这时要输出一个0;

 

 

来,上代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int len,ans[300];char ch[300],ch_1[300],ch_2[300];bool cmp(char a,char b){    return a>b;}int main(){    cin>>ch;    len=strlen(ch);    for(int i=0;i<len;i++)    {        if(ch[i]>9||ch[i]<0)        {            cout<<"NO"<<endl;            return 0;        }        ch_1[i]=ch[i],ch_2[i]=ch[i];    }    sort(ch_1,ch_1+len,cmp);    sort(ch_2,ch_2+len);    cout<<ch_1<<-<<ch_2<<=;    for(int i=0;i<len;i++)    {        ans[i]=ch_1[i]-ch_2[i];    }    for(int i=len-1;i>=0;i--)    {        if(ans[i]<0) ans[i-1]--,ans[i]+=10;    }    bool if_=true;    for(int i=0;i<len;i++)    {        if(ans[i]==0) continue;        if_=false;        for(int j=i;j<len;j++) cout<<ans[j];        break;    }    if(if_) cout<<0;    return 0;}

 

去重排序