高精度排序[模板]

高精度一向是一個讓本蒟蒻頭禿的東西,今天居然要寫高精度的排序。。。

輸入數的個數,以及每個數,求出其中最大數及其編號。

大體思路

通過貪心的辦法,每次輸入時記錄最大數的編號以及最大數的位數,將所有數存入一個二維數組(如果之後不用的話可以不存儲),然後每次輸入時只要比較位數就可以了,如果位數一樣就比較最高位大小,如果還一樣就比較次高位大小……依次類推,找出到底誰大。

核心:將多個數的比較通過貪心(可以理解爲冒泡排序)轉換爲兩個高精度數的比較

上代碼

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ma,a[30][1000],maxx;

MAXX存儲最大數的位數,ma存儲最大數的編號

char x[105];
int com(int a,int b)
{
    if(a<b) return 0;
    if(a>b) return 1;
    if(a==b) return 2;
}

爲了方便寫的比較函數

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        for(int j=0;j<strlen(x);j++) a[i][j]=x[j]-'0';
        if(strlen(x)>maxx)
        {
            maxx=strlen(x);
            ma=i;
        }

以上爲存儲

下面重點來了

        else if(strlen(x)==maxx)
        {
            for(int j=0;j<strlen(x);j++)
            {
                int f=com(a[ma][j],a[i][j]);
                if(f==0)
                {
                    ma=i;
                    break;
                }
                if(f==1) break;
                if(f==2) continue;
            }
        }
    }

0,1,2分別代表三種狀態(<,>,=),如果這一位等於就繼續循環,比較下一位。比較出來差異就break掉

cout<<ma+1<<endl;

因爲是從0開始存的數組,所以要+1

for(int i=0;i<maxx;i++)
    {
        cout<<a[ma][i];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章