【nyoj-1233】差值
描述
输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1, 2},则输出9。
输入
- 第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。
输出
- 输出最大数最小数的差值,输出占一行。
样例输入
-
1 3 1 2 3
样例输出
198
- 大整数减法,关键是想好如何排序。排序规则是比较s1+s2和s2+s1的大小。
#include <bits/stdc++.h> using namespace std; const int N = 21000; struct node { char s[20]; } q[1015]; int a[N], b[N]; bool gminus(int *a,int *b) { for(int i = 1; i <= a[0]; i++) { if(a[i]<b[i]) { a[i+1]--; a[i]+=10; } a[i]=a[i]-b[i]; } while(a[a[0]]==0&&a[0]) a[0]--; if(!a[0]) return 0; return 1; } int cmp(node a,node b) { int la=strlen(a.s); int lb=strlen(b.s); int l=max(la,lb); for(int i=0; i<l; i++) { if(a.s[i%la]<b.s[i%lb]) return 1; else if(a.s[i%la]>b.s[i%lb]) return 0; } return 1; } int main() { int t, n; cin>>t; while(t--) { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%s", q[i].s); sort(q, q+n, cmp); char s[N]; memset(s, 0, sizeof s); for(int i = 0; i < n; i++) strcat(s, q[i].s); int num = 0, l = strlen(s); for(int i = l-1; i >= 0; i--) b[++num] = s[i]-'0'; b[0] = num, num = 0; memset(s, 0, sizeof s); for(int i = n-1; i >= 0; i--) strcat(s, q[i].s); for(int i = l-1; i >= 0; i--) a[++num] = s[i]-'0'; a[0] = num; bool f = gminus(a, b); if(!f) printf("0"); else for(int i = a[0]; i>=1; i--) printf("%d", a[i]); cout<<endl; } return 0; }