• 最大整数


    题目描述

    设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数.

    例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 34331213

    又如: n=4时, 4个整数7,13,4,246连接成的最大整数为: 7424613

    输入输出格式

    输入格式:

    n n个数

    输出格式:

    连接成的多位数

    输入输出样例

    输入样例

    3
    13 312 343

    输出样例

    34331213

    这道题是一道贪心题,将最高位大的数放在前面。两个数比较时,只用比较高位:若 num[i] 的高位大于 num[j] 的高位,则返回 num[i] > num[j];否则下一位比较。

    但大多数情况下两个数位数并不相同,而且如果这两个数位数相同的部分数字也恰好相等,就需要另作考虑:刚开始我想直接返回位数大的数值就大,但这其实是不全面的的,比如说 223 和 22,就返回 223 > 22,排的时候就是 22322,是对的;但是若 221 和 22,仍返回 221 > 22,合成为 222122,但应该是 22221。

    我就又想了想:出现上一种情况后,应该再比较位数小的数的最后一位 num[l1 - 1] 和位数大的数的 num[l1]。还是char a[] = {"221"} 和 b[] = {"22"},应该再比较一下 a[2] 和 b[1] ,因为 a[2] < b[1],所以返回 a < b,a 排在 b 后面。

    对于以上这种排序规则,用代码实现的话可以定义用结构体排序,重载 < 运算符。

    就这样

     1 struct NUM
     2 {
     3     char num[15];
     4     bool operator < (const NUM& other)const
     5     {
     6         int l1 = strlen(num), l2 = strlen(other.num);
     7         int i = 0;
     8         while(i < min(l1, l2))
     9         {
    10             if(num[i] == other.num[i]) i++;
    11             else return num[i] > other.num[i]; 
    12         }
    13         if(l1 > l2) return num[l2] > other.num[l2 - 1];
    14         else return num[l1 - 1] > other.num[l1];
    15     }
    16 }a[25];

    完整代码

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 struct NUM
     8 {
     9     char num[15];
    10     bool operator < (const NUM& other)const
    11     {
    12         int l1 = strlen(num), l2 = strlen(other.num);
    13         int i = 0;
    14         while(i < min(l1, l2))
    15         {
    16             if(num[i] == other.num[i]) i++;
    17             else return num[i] > other.num[i]; 
    18         }
    19         if(l1 > l2) return num[l2] > other.num[l2 - 1];
    20         else return num[l1 - 1] > other.num[l1];
    21     }
    22 }a[25];
    23 int n;
    24 char ans[1005];
    25 int main()
    26 {
    27     scanf("%d", &n);
    28     for(int i = 1; i <= n; ++i) scanf("%s", a[i].num);
    29     sort(a + 1, a + n + 1);
    30     for(int i = 1; i <= n; ++i)
    31         strcat(ans, a[i].num);  //用 cstring 库里的 strcat 函数,将 a[i].num 复制到 ans 的后面,返回 ans
    32     printf("%s
    ", ans);
    33     return 0;
    34 }

    当然也可以不用结构体排序,自己写一个 cmp 比较函数,效果都一样。

  • 相关阅读:
    [附件解决方案]CruiseControl.NET 超冷门”BUG” 关键字:VstsHistoryParser ParseChangeSet CheckForModifications FormatException
    SQL SERVER 2008 函数大全 字符串函数
    第五章 DOM接口 DOM Interfaces
    [MSSQL]FOR XML AUTO I
    DOS CHOICE命令
    [MSSQL]NTILE另类分页有么有?!
    原生态webglDEMO,以后可能选择Three.JS来代替了,代码网上找的,参考引用
    [MSSQL]COALESCE与ISNULL函数
    【转】“无法在Web服务器上启动调试。您不具备调试此应用程序的权限,此项目的URL位于Internet区域”错误提示的解决
    【转】一个项目涉及到的50个Sql语句(整理版)
  • 原文地址:https://www.cnblogs.com/mrclr/p/8340110.html
Copyright © 2020-2023  润新知