| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3162 人关注过本帖, 2 人收藏
标题:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。。。
只看楼主 加入收藏
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:10 
我也来发发段代码,可能效率没楼上的好:qsort函数没有去查它的介绍,所以只是用了最简单的冒泡排序.
程序代码:
#include <stdio.h>
#include <stdlib.h>


#define N 10000

int
cmpFun (int n1,int n2)
{
      
    char *p1 =( char[20] ){ 0 } ,
         *p2 =( char[20] ){ 0 } , ch = 0 ;
   
    sprintf( p1,"%d",n1 );
    sprintf( p2,"%d",n2 );
   
    for (   --p1,--p2; (*++p1 == *++p2) && (p1[1]) ;   )   ;

    return   (*p1    > *p2   )  ?    1  :
             (*p1    < *p2   )  ?   -1  :
             ( p1[0] >  p2[1])  ?    1  :  -1;
            
}

void
sort (int *arrNum,unsigned long  j)
{
#define SWAP(x,y,temp)   ( (temp)=(x), (x)=(y), (y)=(temp) )

    int  temp=0,  *walk,
        *first = arrNum,
        *last  = arrNum+j+1;
   
    for (   ; first<--last;   )
        for (   walk=first-1; ++walk<last;   )
            if  (   cmpFun(walk[0],walk[1]) < 0  )   SWAP(walk[0],walk[1],temp);

}



int
main( void )
{
     
    int input, i,j,ch,nZero=0,
        arrNum[N]={0};
     
    for (   j=i=-1; ++i < N ;   )
        {
        scanf( "%d",&input );
        if   (   input<0   )    break;
        else if ( input==0 )  ++nZero;
        else                    arrNum[++j]=input;
       
        while( (ch=getchar()) != '\n' )   ;
        } 
   
    sort(arrNum,j);
   
    puts ( "\n--------------------------------");
    for (   i=-1; ++i<=j ;   )
            printf( "%d",arrNum[i] );
   
    if  ( nZero )    printf( "%0*d",nZero,0);
   
    return    0;     
     
}


悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-04 15:53
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 10楼 maotai
测试结果:
输入:
3
56
56565
560
输出:
5656556560
是否正确,你分析呢??
正确应该为:
5656565560
但是你的程序没给出这样的结果!!!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 20:31
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 11楼 Windy0Winll
你的程序,我初步看了下,输入的思路好像有点不清晰呢,运行没有得到结果!不知道你的运行结果如何?你输入什么测试数据?可以用我的数据测试下!!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 20:40
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 13楼 jack10141
感兴趣的朋友注意,形如以下形式的数,在排序比较的时候应该是相等的关系,才符合本问题的逻辑:
第一组:
5 55 5555 5555555555.............
第二组:
56 5656 56565656 ............
第三组:
314 314314314 314314314314314............   
以此类推
(也就是说,以上三组中的数同一组的数排到一起,前后次序不会影响接龙结果的大小)

[ 本帖最后由 jack10141 于 2010-9-4 20:54 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 20:51
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
----输入的思路好像有点不清晰呢----
----3 56 56565 560 输出:5656556560----
呵呵,我没看清楚题目,没看到第一个数是输入的个数.我把第一个数当平常数来处理了.
我写的程序不是很多,所以有时候思路确实不清晰,下面我给出输入部分的注释:
程序代码:

for (   j=i=-1; ++i < N ;   )
    {
    scanf( "%d",&input );
    if   (   input<0   )    break;  //是不能输入负数的,所以用负数来控制输入结束
    else if ( input==0 )  ++nZero;  //如果输入的是0,没必要参加排序,最后直接输出就好了.nZero是0的个数
    else                    arrNum[++j]=input;//记录数据
      
    while( (ch=getchar()) != '\n' )   ;//用来吸收非法字符,如'a'等,否则有非法字符输入会一直循环
    }






悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-04 21:15
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
回复 12楼 jack10141
====
测试结果:
输入:
3
56
56565
560
输出:
5656556560
是否正确,你分析呢??
正确应该为:
5656565560
但是你的程序没给出这样的结果!!!
====


把输入部分改成 56  56565  560 -1 输出的结果应该会是5656565560

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-04 21:20
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
应该到了说答案的时间了吧?我去写个代码,御坂说

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-04 21:23
maotai
Rank: 2
等 级:论坛游民
帖 子:5
专家分:25
注 册:2010-9-3
收藏
得分:0 
回复 12楼 jack10141
这样吧
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int comp(const void *p, const void *q)
{
    char *a = (char *)p;
    char *b = (char *)q;
    int len1 = strlen(a);
    int len2 = strlen(b);
    int i, j;
    if (len1 == len2) return strcmp(b, a);
    else if (len1 > len2)
    {
        i = j = 0;
        while (i < len1)
        {
            if (a[i] != b[j]) return b[j] - a[i];
            ++i;
            ++j;
            if (j == len2) j = 0;
        }
        if (j == 0) return 0;
        else return 1;
    }
    else
    {
        i = j = 0;
        while (j < len2)
        {
            if (a[i] != b[j]) return b[j] - a[i];
            ++i;
            ++j;
            if (i == len1) i = 0;
        }
        if (i == 0) return 0;
        else return -1;
    }
}

int main()
{
    int n, i;
    char s[1000][11];
    while (scanf("%d", &n) != EOF)
    {
        for (i = 0; i < n; ++i) scanf("%s", s[i]);
        qsort(s, n, sizeof(s[0]), comp);
        for (i = 0; i < n; ++i) printf("%s", s[i]);
        printf("\n");
    }
    return 0;
}


 
2010-09-04 21:28
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 17楼 御坂美琴
这个题目我也没标准答案,只是我自己在一个地方看到的题目,感觉有点意思,就给大家贴出来了,呵呵。。。

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 21:57
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用jack10141在2010-9-4 21:57:56的发言:

这个题目我也没标准答案,只是我自己在一个地方看到的题目,感觉有点意思,就给大家贴出来了,呵呵。。。
标准答案在我手上呢,你想什么时候发答案呀?御坂问道

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-04 22:11
快速回复:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。 ...
数据加载中...
 
   



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

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