zoukankan      html  css  js  c++  java
  • 去重排序

    题目背景

    一个简单的数学题。。。

    题目描述

    输入一个数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;
    }
  • 相关阅读:
    指定pdf的格式
    iptables 防火墙
    jumpserver2
    jquery UI
    python 自动化审计
    Jumpserver
    认识二进制安全与漏洞攻防技术 (Windows平台)
    将这段美化的css代码
    pycharm
    android Tips
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6362619.html
Copyright © 2011-2022 走看看