整数拼数

加油!把KMP和AC自动机拿下!

这题主要利用两个数可以比较大小的三个性质。

(1)自反性 aa = aa

  (2)  对称性 如果a <b 则ab<ba ba > ab

  (3)  传递性  如果a < b,则ab < ba

因为拼接好的字符串满足这个性质,所以可以比较大小

还有最直观的想法是影响判断一个数最大的影响因素是它的长度,如果把字符串拼接

在一起则长度相同,比较一下大小应该就能清楚的判断两个字符串在前面益处更大,

按升序排好应该就是最小的数,


#include<iostream>
#include<cstdio> 
#include<cstring>
 
using namespace std;
 
char array[1001][1001];
char temp[1001];
 
char temp1[2001], temp2[2001];
 
 
 
 
bool compare(char* a1, char* a2)
{
    char *p1 = a1, *p2 = a2, *p3 = temp1;
    while(*p1 != '\0')
    {
        *p3 = *p1;
        p1++; p3++;
    }
     
    while(*p2 != '\0')
    {
        *p3 = *p2;
        p2++; p3++;
    }
    *p3 = '\0'; 
     
    p1 = a1, p2 = a2, p3 = temp2;
    while(*p2 != '\0')
    {
        *p3 = *p2;
        p2++; p3++;
    }
     
    while(*p1 != '\0')
    {
        *p3 = *p1;
        p1++; p3++;
    }
    *p3 = '\0'; 
     
    if(strcmp(temp1, temp2) > 0)
        return true;
    return false;
}
 
 
 
 
void ShellSort(int length)
{
     
    int d = length/2;  
    int i, j;
    char *p1, *p2;
    while(d>=1)    
    {
        for(i=d;i<length;i++)    
        {    
            p1 = temp, p2 = array[i];
            while(*p2 != '\0')
            {
                *p1 = *p2;
                p1++; p2++;
            }
            *p1 = '\0';
             
            j=i-d;
            while(j>=0 && compare(array[j], temp) > 0)  
            {    
                p1 = array[j+d], p2 = array[j];
                while(*p2 != '\0')
                {
                    *p1 = *p2;
                    p1++; p2++;
                }
                *p1 = '\0';
                j=j-d;    
            }    
            p1 = array[j+d], p2 = temp;
            while(*p2 != '\0')
            {
                *p1 = *p2;
                p1++; p2++;
            }
            *p1 = '\0';
        }
         
        d= d/2;   
    }
}
 
 
int main()
{
    int size, i;
    while(1)
    {
        cin >> size;
        if(size == 0)
            break;
        for(i = 0; i < size; i++)
           cin >> array[i];
        ShellSort(size);
        for(i = 0; i < size; i++)
            cout << array[i];
        cout << endl;
    }
   return 0;
}



2、整数拼数
问题描述 
给你n个整数,用这n个数拼成一个超长的整数,要令这个新的整数最小 
例如: 11 110 123 拼出的最小数为:11011123 
例如: 123 11 11 拼出的最小数为:1111123 

输入 
第一行为n(1<=n<=1000),接下来是n个正整数,使用空格或者换行分开, 
每个数字的长度不会超过1000,不存在前导0; 
当n为0时结束程序

输出 
对于每组输入,输出拼成的新的整数的结果。




输入样例 
3
987 123 190

输出样例 
123190987


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值