去重排序

题目背景

一个简单的数学题。。。

题目描述

输入一个数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;
}
原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6362619.html