| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3162 人关注过本帖, 2 人收藏
标题:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。。。
只看楼主 加入收藏
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 18楼 maotai
这组数据,你测试下:
输入:
3
314
3143
31431
你的程序输出:
314314331431

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 22:13
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用御坂美琴在2010-9-4 21:23:51的发言:

应该到了说答案的时间了吧?我去写个代码,御坂说
期待你的代码。。。

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 22:17
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:30 
#include <string.h>
#include <algorithm>

char* str[1000];
char cstr[2][100];

bool cmp(const char* a, const char* b)
{
    strcpy(cstr[0], a);
    strcpy(cstr[1], b);
    strcat(cstr[0], b);
    strcat(cstr[1], a);
    return !(strcmp(cstr[0], cstr[1]) < 0);
}

int main(int argc, char *argv[])
{
    int n;
    scanf("%d", &n);
    for (int i=0; i<n; ++i)
    {
        str[i] = (char*)malloc(100);
        scanf("%s", str[i]);
    }
    std::sort(str, str+n, cmp);
    for (int i=0; i<n; ++i)
    {
        printf("%s", str[i]);
        free(str[i]);
    }
    puts("");
    scanf("%*s");
    return 0;
}

这是求最大值的标准答案
收到的鲜花
  • cosdos2010-09-04 23:41 送鲜花  10朵   附言:我很赞同

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-04 22:21
御坂美琴
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 22:30
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 23楼 御坂美琴
拜读中。。。
----------------------------------------------------
你的程序的确是正解,也理解了你的关键解题逻辑了,呵呵 学习了!!
----------------------------------------------------
分数不是问题,我在这里也贴出我的代码,大家帮忙测试下,看有疏漏没??
(我用递归实现比较,有些笨...并且主函数也懒得写,借用了别人的)
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int NUM_comp(char *q,char *p)
{
   int i=0;
   while(*(q+i) != '\0' && *(p+i) != '\0' && *(q+i) == *(p+i))i++;
   if( *(q+i) != '\0' && *(p+i) != '\0' && *(q+i) != *(p+i) )
      return (-(*(q+i)-*(p+i)));
   if( *(q+i) == '\0' && *(p+i) != '\0' )
      return NUM_comp((char *)q, (char *)(p+i));
   if( *(q+i) != '\0' && *(p+i) == '\0' )
      return NUM_comp((char *)(q+i),(char *)p);
   if( *(q+i) == '\0' && *(p+i) == '\0' )
      return 0;
}

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]), NUM_comp);
        for (i = 0; i < n; ++i) printf("%s ", s[i]);
    }
    return 0;
}

PS:为了使结果具有直观的可读性,我在输出的每个串尾加了个空白符,方便大家判断结果的正确与否!

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

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 22:59
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
汗,这是C++代码吧??

========
    strcpy(cstr[0], a);
    strcpy(cstr[1], b);
    strcat(cstr[0], b);
    strcat(cstr[1], a);
    return !(strcmp(cstr[0], cstr[1]) < 0);
========
这个比较函数确实可行,不过我觉得它的效率不会很高:
  我个人觉得根本没必要用strcpy和strcat这两个函数。举个例子来说吧,要比较s1="456" 和 s2="4560"还有s3="4568"这3个字符串的大小:首先我们每个字符的比较,发现前面的3个字符456都一样,这样字符s1所指向的是0字符;我们不能再比较下去了,这时候我们只要比较s2中的字符'6'和它后面的一个字符'0',很显然得到的结果是s1>s2;同理s1<s3;如果要比较s2和s3,由于字符串长度一样,直接比较就好了。
也就是说这样我们差不多只要重新写一个类似字符串比较函数就好了,只要在最后的时候在作一个小小的比较就好了。这样,至少在比较函数上比直接用strcmp要好一点,也不要用strcat。
  以前看到别人的文章说C库里的那个qsort的效率比较好,所以直接用那个就好了(C++我基本没学过,不懂,也不知道std::sort它是怎样实现的)。 我个人比较赞同maotai的思路,不过那个比较函数comp还可以进一步改进。




还补充一点:对于 56 5656 56565656 这样的字符的大小也没必要是相等,其实无论是相等还是大于或者小于得到的结果应该都是正确的。

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

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-04 23:13
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
在这个题目的要求下,这个已经没必要去改进了,速度完全是足够了,虽然还能改进,但这样"改进"会破坏了可读性,还不如一个cpy,cat来的清楚

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-04 23:21
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用Windy0Winll在2010-9-4 23:13:21的发言:

汗,这是C++代码吧??

========
    strcpy(cstr[0], a);
    strcpy(cstr[1], b);
    strcat(cstr[0], b);
    strcat(cstr[1], a);
    return !(strcmp(cstr[0], cstr[1]) < 0);
========
这个比较函数确实可行,不过我觉得它的效率不会很高:
这个办法是我见过的最牛的解此题的实现办法,很有效,效率没考虑过,关键我们现在不是来追求效率的!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-04 23:24
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
赞同楼上,一题多解。呵呵!  :)

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-04 23:25
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
代码确实很好。



—>〉Sun〈<—
2010-09-04 23:41
快速回复:发个小题目来娱乐下,大家有空的,一起来讨论下,然后贴上你的代码来。 ...
数据加载中...
 
   



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

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