红石榴花生油 2023-03-01 16:39 采纳率: 100%
浏览 39
已结题

关于整数拼数的问题,用了贪心算法,WA如何解决?(语言-c语言)

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

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

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

输入样例
987 123 190
输出样例123190987


#include <stdio.h>
#include <math.h>

int fun1(int i)
{
    int j;
    for(j=0;i>0;j++,i/=10) ;
    return j;
}

int fun(int a,int b)
{
    int i,j,t=0;
    i=fun1(a),j=fun1(b);
    if((a*pow(10,j)+b)>(b*pow(10,i)+a)) return 1;
    else return 0;
}

int main()
{
    int n;
    int i,j,t;
    int a[1000];
    
    scanf("%d",&n);
    if(n==0) return 0;
    
    for(i=0;i<n&&i<1000;)
    {
        scanf("%d",&j);
        if(j>0&&j<=1000)
        {
            a[i]=j;
            i++;
        }
    }
    
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(fun(a[i],a[j])) t=a[j],a[j]=a[i],a[i]=t;
        }    
    }    
    
    for(i=0;i<n&&i<1000;i++)
    {
        printf("%d",a[i]);
    }
    return 0;
 } 
  • 写回答

2条回答 默认 最新

  • QWQ.qwq 2023-03-01 20:31
    关注
     
    #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;
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月16日
  • 已采纳回答 7月8日
  • 创建了问题 3月1日