算法题:整数排成一排求最大值

算法题:整数排成一排求最大值

题目描述

【编程题】丈母娘的考验
题目ID:1136
【问题描述】小豪和女友恋爱数年,终于要修成正果了。今天,他将以准女婿的身份去女友家,唉呀,忐忑不安。
丈母娘一见小豪,嗯嗯,果然是传说中的高富帅,不错不错!
额额额,等会,这孩子不会是红漆马桶吧?长得好看,可是一肚子的粑粑o(^▽^)o,那可配不上我家宝贝乖乖女儿哦。
“小豪,好孩子,能帮阿姨一个忙吗?老年大学有一道题,我还不会呢。”
原来是这样的一道题:有三个正整数,将其连成一排,求最大的数。
例如,5,6,7,最大数为765;又如33,444,5,最大数为544433
你能帮小豪做出这道题吗?使得小豪能通过丈母娘的考验,迎娶白富美,走上人生巅峰。
【输入形式】三个正整数i,j,k(1<=i,j,k<=30000)
【输出形式】最大数
【样例输入】

【测试用例】
1)
输入:
65 654 6543
输出:
656546543

2)
输入:
12 123 1234
输出:
123412312

3)
输入:
123 32 51
输出:
5132123

4)
输入:
87 234 43
输出:
8743234

5)
输入:
234 355 1987
输出:
3552341987

思路分析

  • 首先想到的是以int类型存储,取每个数的第一位,进行对比,然后进行冒泡排序,输出,假如第一位相同呢,不是还得对比第二位吗,第二位也同呢不是还得对比第三位吗,太过麻烦,不可行(x)
  • 然后可以想到以字符串的类型进行存储,利用string.h中的strcmp函数进行对比,就可以解决对比完第一位还得对比第二位第三位的麻烦问题了,例如对比234和355,可对比出355是大于234的,但是新的问题又出现了,这个数字的位数是不固定的,strcmp函数对比的结果不一定是正确的,例如65和654,strcmp直接对比出的是654大,而我们要的是排列顺序是65654,而不是65465
  • 为了解决这个难题,我们可以采用先合并再对比的方法取正确的值,也就是如果字符串A+B>B+A,则A的优先级比较高,A应该放在前面,例如65和654,65654比65465的strcmp值大,则65应该先输出.

代码描述

#include<stdio.h>
#include<string.h>
int main()
{
   char a[3][6];            //定义二维数组,以行保存字符串
   int i;
   for (i=0;i<3;i++){
       scanf("%s",&a[i]);       //按行读入字符串
   }
   int j;
    for (i=0;i<3;i++){
        for (j=0;j<3-i-1;j++){          //j多减1,防止数组越界
            char tema[12],temb[12];       //临时数组保存要比较的值
            strcpy(tema,a[j]);
            strcat(tema,a[j+1]);            
            strcpy(temb,a[j+1]);
            strcat(temb,a[j]);
            if (strcmp(tema,temb)<0){       //比较a+b与b+a的大小(字符串比较),把小的顶到右边去
                char tem[6];                   //临时数组保存a[i]
                strcpy(tem,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],tem);
            }
        }
    }
    for (i=0;i<3;i++){          //按行输出二维数组
        printf ("%s",a[i]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fanqieya/p/10807394.html