去重排序
题目背景
一个简单的数学题。。。
题目描述
输入一个数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; }