| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:一个排序的问题
只看楼主 加入收藏
文图
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-28
收藏
 问题点数:0 回复次数:3 
一个排序的问题
设有N个正整数(N<20),将它们连成一排,组成一个最大的多位数。程序输入:N,程序输出:N个数连接成的多位数。
【提示】:(老师告诉我们的提示)
设计思路:
比如我们输入的是 123 2 33 1006 12 这样几个数
我们先找出最大的数字的位数为四位,在将所有的数字变成四位数:
1230 2000 3300 1006 1200
然后从大到小排序:3300 2000 1230 1200 1006
这样将后面加上的0去掉的序列就是最大的数字:332123121006
这个题怎么做 啊?有谁可以帮一下
搜索更多相关主题的帖子: 正整数 
2008-08-28 21:58
csynyk
Rank: 1
等 级:新手上路
威 望:1
帖 子:114
专家分:0
注 册:2008-8-9
收藏
得分:0 
按照这个提示可以达到目的,但不是最好的思路!

http://blog./csynyk
2008-08-29 01:30
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
程序代码:
/*******************************************************************************

        一个排序的问题
        设有N个正整数(N<20),将它们连成一排,组成一个最大的多位数。程序输入:N,
    程序输出:N个数连接成的多位数。
        【提示】:(老师告诉我们的提示) 
        设计思路: 
        比如我们输入的是 123 2 33 1006 12 这样几个数 
        我们先找出最大的数字的位数为四位,在将所有的数字变成四位数: 
        1230 2000 3300 1006 1200 
        然后从大到小排序:3300 2000 1230 1200 1006 
        这样将后面加上的0去掉的序列就是最大的数字:332123121006 

*******************************************************************************/
#include<stdio.h>
#define N 20
int jc(int a)
{
        if(a>1000&&a<=9999)  return 4;
        if(a>100&&a<999)     return 3;
        if(a>10&&a<99)       return 2;
}
int num(int a,int b)      /* 用递归法把小数值加零 */
{
        if(a<b) num(a*10,b);
        else return(a);
}
void sore(int *p,int *q,int k) /* 选择排序函数 */
{
        int i,j,m,tmp;
        for(i=0;i<k;i++)
        {
                m=i;
                for(j=i+1;j<k;j++)
                        if(p[m]<p[j])    m=j;
                if(m!=i)
                {
                        tmp=p[m];
                        p[m]=p[i];
                        p[i]=tmp;
                        tmp=q[m];
                        q[m]=q[i];
                        q[i]=tmp;
                }
        }
}

int main(void)
{
        int INPUT[N];
        int _input[N];
        int max=0;
        int i,j,k;
        printf("下面请输入数据。系统默认是20个数字,如果要提前结束输入,请输\n"
               "入负数.另外系统默认输入是4位数,如果输入数值过大,此次操作无效。\n");
        for(k=0;k<N;k++)   /* 输入 */
        {
                printf("input NO.%d\n",k+1);
                scanf("%d",&INPUT[k]);
                if(INPUT[k]<0)    break;
                if(INPUT[k]>=10000)
                {
                        k--;
                        continue;
                }
        }
        for(i=0;i<k;i++)
        {
                _input[i]=INPUT[i];
                if(max<INPUT[i])  max=INPUT[i];   /* 找出最大数值 */
        }
        j=jc(max);
        switch(j)
        {
                case 4: j*=1000;  break;
                case 3: j*=100;   break;
                case 2: j*=10;    break;
        }
        for(i=0;i<k;i++)
                _input[i]=num(_input[i],j); /* 把小数值加零 */
        sore(_input,INPUT,k);    /*   数组排序 */
        printf("output :\n\n\n");
        for(i=0;i<k;i++)         /*  输出 */
                printf("%d",INPUT[i]);
        getch();
}
2008-08-29 02:03
liotta
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-8-29
收藏
得分:0 
回复 1# 文图 的帖子
该方法有问题,很容易溢出!

我想正确的做法是:
整数转字符串
字符串排序
输出

[[it] 本帖最后由 liotta 于 2008-8-29 13:00 编辑 [/it]]
2008-08-29 12:32
快速回复:一个排序的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015817 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved