zoukankan      html  css  js  c++  java
  • 拼数(C++)

    问题:

    设有n个正整数,将他们排成一排,组成一个最大的多位整数。

     

    INPUT:

    第一行,正整数的个数n

    第二行,n个正整数

     

    OUTPUT:

    一个正整数,表示最大的整数。

     

    输入样例:

    3

    13 312 343

     

    样例输出:

    34331213

     

    思路:

    如果我们把每个输入的正整数当作正数来处理的话,

    我们会发现我们很难处理。

    因为存在情况一个数是另一个数的前缀的情况。

    这个时候不知道要比较多少位。

    比如说,4个正整数 756  212 2123 21231.

    这时就很麻烦。

    而如果我们把这些数字当作字符串来处理的话,过样例是没问题,

    但是对于我刚刚给出那个输入可能就会出错。

    因为字符串比较大小的时候不是看数的大小,而是看首字符的大小,依次递推。

    比如说:

    2123

    21231

    首字符相同,第二,三,四字符相同,那么就比较第五个字符,其中321第三个字符为1,而32没有,

    所以字符串比较的时候,21231就在2123前面,而我们需要的是2123在21231前面。

    这个时候需要我们自定义一种新的大小比较方式。

    即:IF A+B>B+A , A>B.

    如何证明呢?这里引用一下dmy大佬的作业题解:

    然后我们对输入这些字符串进行排序,从大到小输出字符串,即可输出最大正整数。

    代码如下

     1 #include<bits/stdc++.h>  //这个头文件包含了C++所有头文件
     2 using namespace std;
     3 int main()
     4 {
     5     int n;
     6     cin>>n;
     7     string t1,t2,a[n];
     8     for (int i = 0; i < n; i++) cin>>a[i];
     9     for (int i = 0; i < n-1; i++)  //为了简便明了,用选择排序
    10     {
    11         for (int j = i+1; j < n; j++)
    12         {   //if a+b>b+a,a>b
    13             t1=a[i]+a[j];
    14             t2=a[j]+a[i];
    15             if (t1<t2) swap(a[i],a[j]); //swap()函数在std命名空间里
    16         }
    17         
    18     }
    19     for(int i=0;i<n;i++) cout<<a[i];
    20     return 0;   
    21 }
  • 相关阅读:
    获取物料批次特性取值BAPI
    获取域的固定值的函数:DD_DOMVALU…
    CJ20N中对WBS元素执行删除操作时触…
    SM30相关操作
    CL03对应的BAPI(根据类查特性)
    两个数值交换
    char*,string,float,int 转换
    字符串 分割
    C++ 关于I/O
    TCP
  • 原文地址:https://www.cnblogs.com/Arthas8086/p/12057032.html
Copyright © 2011-2022 走看看