| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3162 人关注过本帖, 2 人收藏
标题:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。。。
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 40楼 御坂美琴
莫非你以为写的像你的代码那么多的指针引用才叫好?事实上这里有一个关键的语法点可以让你简化代码并且让代码更清晰的,可能你还不知道
// 也是说我的吧

我是说,我以前没有 A掉那题, 帮我看看效率吧。现在有点忙,
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char a[2005], b[2005];
int comp(const void *p1, const void *p2)
{
    sprintf(a, "%s%s", (*(char**)p1), (*(char**)p2));
    sprintf(b, "%s%s", (*(char**)p2), (*(char**)p1));

    return strcmp(a, b);
}
int main(void)
{
    char s[1002][1002];
    char *p[1002];
    int i, n;
    while (scanf("%d", &n), n != 0)
    {
        for (i = 0; i < n; i++)
        {
            scanf("%s", s[i]);
            p[i] = s[i];
        }

        qsort(p, n, sizeof(p[0]), comp);
        for (i = 0; i < n; i++)
            printf("%s", p[i]);
        printf("\n");
    }

    return 0;
}


[ 本帖最后由 BlueGuy 于 2010-9-5 11:16 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-09-05 11:04
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 41楼 BlueGuy
拜读了 ,不过好像你的解题思路与 御坂美琴 是相同的 不过换了别的函数实现而已!!学习了!!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-05 11:16
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
我不是说blueguy,你的代码可读性一样,不过对于如果不知道sprintf的人就会麻烦一些,所以我还是选择用cpy,cat写出来

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-05 11:23
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
:)后来我发现原来我原来的思路是错的。重写了一断代码,不过,如果不是在特殊的机器上,效率很低:在比较大小的时候用了2次乘法。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#undef   NDEBUG
#include <assert.h>


#define N 10000

int
cmpFun (long long n1,long long  n2)
{                    /* 比较大小  */
     
    static const long long table [ ] = {
           1LL,10LL,100LL,1000LL,10000LL,100000LL,1000000LL,10000000LL,100000000LL,1000000000LL,10000000000LL,
           100000000000LL,1000000000000LL,10000000000000LL,100000000000000LL,100000000000000LL,1000000000000000LL,10000000000000000LL};
    char *p1 =( char[20] ){ 0 } ,
         *p2 =( char[20] ){ 0 } ;
   
    sprintf( p1,"%I64d",n1 );  assert( strlen(p1)<19 );
    sprintf( p2,"%I64d",n2 );  assert( strlen(p1)<19 );
   
    return    n1 * table[ strlen(p2) ] + n2 > n2*table[ strlen(p1) ] +n1  ?  1  : -1 ;
   
           
}

void
sort (long long *arrNum,unsigned long  j)
{                               /* 冒泡法排序 */
#define SWAP(x,y,temp)   ( (temp)=(x), (x)=(y), (y)=(temp) )

    long long  
         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        i,  j,   ch , nZero=0 ,n;
     long long  input,arrNum[N]={0};
    
     cmpFun( 0,0 );
   
    scanf( "%d",&n );   assert( n<N  );
    for (   j=i=-1; ++i < n ;   )
        {
        scanf( "%I64d",&input );                     //输入long long(64位) 数
        if   (   input<0LL   )    break;             //输入了负数,退出输入
        else if ( input==0LL )  ++nZero;             //输入的是0,不要参加排序,最后直接输出就好了
        else                    arrNum[++j]=input;   //记录数据,等下好参加排序
      
        while( (ch=getchar()) != '\n' )   ;          //吸收非法字符
        }
  
    sort(arrNum,j);
  
    puts ( "\n--------------------------------");
    for (   i=-1; ++i<=j ;   )                       //输出结果
            printf( "%I64d",arrNum[i] );
  
    if  ( nZero )    printf( "%0*d",nZero,0);        //输出 0
  
    //system( "pause" );
    return    0;    
    
}

 

[ 本帖最后由 Windy0Winll 于 2010-9-5 13:23 编辑 ]

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-05 13:14
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
回复 41楼 BlueGuy
我说说我个人的观点:
1.比较函数comp:还不如直接用御姐给出的strcpy和strcat,像这些类似于printf这样的函数需要格式转换(平常我们可以尽可能的使用putchar或puts等),在函数调用过程中就可能需要做比较,而strcpy和strcat是直接对字符操作的.
2.scanf("%s", s[i]);直接输入字符串来代替输入整数,个人觉得还应该对s[i]在检查一遍,不然输入中有其它字符怎么办,如我们输入"_56456!",这应该不能代替一个数吧.
3.下面代码是从你原来代码中复制来的:
程序代码:
int comp(const void *p1, const void *p2)
{
    sprintf(a, "%s%s", (*(char**)p1), (*(char**)p2));
    sprintf(b, "%s%s", (*(char**)p2), (*(char**)p1));

    return strcmp(a, b);  //我觉得这里要修改,该为这样好了 return  -strcmp(a,b);
}


4.我觉得如果不重写复制字符串函数,御姐的代码真的够好了:)

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-05 13:54
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
首先, 感谢您对我写的劣质代码提出宝贵的意见。

1.比较函数comp:还不如直接用御姐给出的strcpy和strcat,像这些类似于printf这样的函数需要格式转换(平常我们可以尽可能的使用putchar或puts等),在函数调用过程中就可能需要做比较,而strcpy和strcat是直接对字符操作的.
//
sprintf 与 strcpy/strcat 谁优谁劣,没什么讨论的价值, 不过我要提醒您一句, sprintf 的使用频率远远高于 strcpy/strcat之和。

2.scanf("%s", s[i]);直接输入字符串来代替输入整数,个人觉得还应该对s[i]在检查一遍,不然输入中有其它字符怎么办,如我们输入"_56456!",这应该不能代替一个数吧.
//有道理, 不过要分清场合,做这种题目的时候没有这个必要。出题人不会用 错误的输入 来验证程序的正确性。

3.下面代码是从你原来代码中复制来的:
程序代码:
int comp(const void *p1, const void *p2)
{
    sprintf(a, "%s%s", (*(char**)p1), (*(char**)p2));
    sprintf(b, "%s%s", (*(char**)p2), (*(char**)p1));

    return strcmp(a, b);  //我觉得这里要修改,该为这样好了 return  -strcmp(a,b);
}
//不明原因, 难道是我的代码过于简洁让你感到不满?

4.我觉得如果不重写复制字符串函数,御姐的代码真的够好了:)
//
保留意见。

我就是真命天子,顺我者生,逆我者死!
2010-09-05 14:40
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
return strcmp(a, b);  //我觉得这里要修改,该为这样好了 return  -strcmp(a,b);
如果 strcmp(a, b);  前面不加负号有可能输出错误的结果,也有可能是我理解错了

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-05 14:53
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 47楼 Windy0Winll
不太清楚, 御姐的是标程, 等她来看看吧。
我也不能理解御姐为什么写成这个样子
return !(strcmp(cstr[0], cstr[1]) < 0);

我就是真命天子,顺我者生,逆我者死!
2010-09-05 15:06
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
搞了半天,你的代码是根据御姐改的??

如果我没理解错的话,没有那个负号,你那个程序输出的字符串顺序是反序的.

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-05 15:12
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
搞了半天,你的代码是根据御姐改的??
// 你真是有意思啊, 你从哪看出来我的代码是根据御姐改的

我就是真命天子,顺我者生,逆我者死!
2010-09-05 15:26
快速回复:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。 ...
数据加载中...
 
   



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

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