nyoj 1233 差值

擊打開鏈接

差值

時間限制:3000 ms  |  內存限制:65535 KB
難度:2
描述

     輸入一個整數數組,將它們連接起來排成一個數,找出能排出的所有數字中最大,最小的兩個,輸出兩個數的差值。例如輸入數組{1,  2},則輸出9


輸入
第一行輸入一個整數T,表示有T組測試數據。每組測試數據的第一行輸入一個整數n(0<n<=1000),第二行輸入n個整數ai(0<=ai<2^32)。
輸出
輸出最大數最小數的差值,每個輸出各佔一行。
樣例輸入
1
3
1 2 3
樣例輸出
198

思路:在排序時將兩個字符串前後組合-->s1s2 ,  s2s1 比較大小 見代碼


code:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include<string.h>
#include <iostream>
#define maxx 10
using namespace std;
int a[100000],b[100000],c[100000];
char * str_1 = new char[maxx*2 + 1];
char * str_2 = new char[maxx*2 + 1];

int compare(const void * str1, const void * str2)//排序函數
{
    strcpy(str_1, *(const char **)str1);
    strcat(str_1, *(const char **)str2);

    strcpy(str_2, *(const char **)str2);
    strcat(str_2, *(const char **)str1);

    return strcmp(str_1, str_2);
}

int compare1(const void * str1, const void * str2)//排序函數
{
    strcpy(str_1, *(const char **)str1);
    strcat(str_1, *(const char **)str2);

    strcpy(str_2, *(const char **)str2);
    strcat(str_2, *(const char **)str1);

    return strcmp(str_1, str_2)==-1;
}

string strsub(string str1,string str2)//大數減法
{
    int i,len1,len2,j;
    string s2="";
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        len1=str1.size();
        len2=str2.size();
        j=0;
        for(int i=len1-1;i>=0;i--)
        a[j++]=str1[i]-'0';
        j=0;
        for(i=len2-1;i>=0;i--)
        b[j++]=str2[i]-'0';

        for(i=0;i<len1;i++){
            c[i]+=(a[i]-b[i]);
            if(c[i]<0){
                c[i+1]--;
                c[i]+=10;
            }
        }
        i=len1-1;
        while(!c[i])
        {
            i--;
            if(i==-1) break;
        }
        if(i==-1)
        {
            s2="0";
            return s2;
        }
        while(i>=0)
            s2+=(c[i--]+'0');
        return s2;
    }

int sort_t(int * arr, int len)
{
    if(arr == NULL || len < 1)
        return -1;

    char ** str_x = (char **)(new int[len]);
    for(int i = 0; i < len; ++i)
    {
        str_x[i] = new char[maxx + 1];
        sprintf(str_x[i], "%d", arr[i]);
    }
    qsort(str_x, len, sizeof(char *), compare);//從小到大
    string s1="";
    for(int i = 0; i < len; ++i)
        s1+=str_x[i];

    qsort(str_x, len, sizeof(char *), compare1);//從大到小
    string s2="";
    for(int i = 0; i < len; ++i)
        s2+=str_x[i];
    cout<<strsub(s2,s1)<<endl;

    for(int i = 0; i < len; ++i)
        delete []str_x[i];
    delete []str_x;
}

int main()
{
    int n,arr[10000],cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&arr[i]);
    sort_t(arr, n);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章