回 帖 发 新 帖 刷新版面

主题:第44次编程比赛结果~~~

首先非常抱歉的是这次题目出得非常的不好:
1、环境的不好,包括定下的gcc编译器,和unsigned long long范围,大部分朋友非常不适应,其实原来的两题的范围都是极大的,远远超过unsigned long long的范围,但这又需要大家处理巨型数的加减乘除和取余运算,比较麻烦,所以定下了整形的最大范围。

2、题目本身的不好,这次题目出得没有什么难度,不涉及很深的数据结构等知识,本意是希望能吸引更多的人参加,希望只要认真学过基础C/C++的都能写出来,但在细节方面则有很多讲究,"都能写出来"实现了,"细节讲究方面",没有实现。事前评估严重不到位。


不过大家辛辛苦苦写出来的程序还是要测试的:)
下面是测试的一下说明:
1、原来指定使用GCC编译器的,但是绝大部分选择了vc,所以最后的编译器选择了,vc2003

2、很多人的程序都不符合测试标准,我对不符合测试标准的进行了一些改动,具体如下:
(1)声明的更改,如果你程序里没有使用任何64位整形变量,则将unsigned long,改为unsigned __int64,如果你程序里有使用64为整形变量,只将这些变量声明改为unsigned __int64,如果你程序里没有使用上述的变量,那么我则将程序里所有整形变量的声明全部改为unsigned __int64而不会考虑需不需要更改

(2)相关函数的更改,如果你的程序里用到需要区分32位或64为变量的函数时,则更改为64位的函数

(3)很多朋友没有按照要求用程序接受参数,进行处理,而使用了标准输入输出,同意改为接受参数形式,第一题参数转数字的函数同意用_atoi64()


以下朋友程序格式完全符合要求,向他们表示感谢:
    wlsss   willzhanglala  独行者  liren0   scanf


有关标准程序:
    这些题目都是我自己想出来的,所以没找到什么现成的标准程序,由于一开始考虑到的范围是非常巨大的,所以我用python写了个程序用作测试,因为python的长整型的范围几乎无限,并且精度到个位,所以我在这就不发出来了



下面开始测试:
第一题:
    1:参数为20亿,程序结果都正确
       在速度上,tenm,xylgg和flypampas的程序耗时在60ms左右,其他人都在40ms左右

    2:参数为:1922337203685477580

       答案:111011000101201111200020011001120020000102002002
     
       结果:heibird,scanf答案错误,kofox,tenm,xylgg,wshong,flypampas超时  

   
第一题:独行者,hotzenlotz,ITER,liren0,wlsss,难分上下
   
        但取极限值2^64-1时
        结果:100110120101002020101011001001110201202012011120101
        得出正确答案的仅wlsss


第二题测试:

        1、参数:accbac
           答案:1573/5040 197/630
           flypampas,xylgg答案出错
           
           当字符串在除了首尾的其他地方出现a时,flypampas的结果会出错

           速度测试基本一样

           (又测试几组数据,算法基本正确)

           当测试到参数:abbcabcacbcabacaca时,tenm第二次提交的程序
           唯一得出了正确答案:3051461327/13332664800 67132149299/293318625600

           答案没有超出范围,但其他朋友的程序在处理数据的时候超出了范围,tenm这点处理的最好



综合以上两题,wlsss没有解答第二题,tenm第二题略占优势,但第一题实现的有问题
              
           
所以我认为,冠军应该是:[color=FF0000]hotzenlotz[/color]
            他两题实现的都还不错,请准备下次比赛



[color=0000FF]由于题目出的很不到位,所以冠军的选出比较困难,再次抱歉~~~[/color]





    

回复列表 (共15个回复)

沙发

倒.
谢谢猫哥的夸讲.
这次比赛题目确实简单,
直接按题目的题意顺着往下做就行了,不需要动脑子.
再加上各位高手都没参与.[em1]

比赛的结果并不重要,只是希望大家能学到一些东西.
既然轮到我出题,那就出有点难度的,希望各位给个面子,捧个场.
题会尽快出,以便大家有时间准备.

板凳

谢谢猫兄,想不到我这个菜鸟,第一次参加比赛也能够在评论时被提名,很了不起了,以后还要多加油啊,希望以后能够写出更好的代码!也希望我们的网站越办越好

3 楼

to hotzenplotz:呵呵,好好出题啊~~

to xylgg:一起加油:)~

4 楼

原来这还算简单的?看来我得努力了。

5 楼

确定简单 呵呵这句话打倒我们新手一片啊,努力努力

我这种垃圾的代码也拿出来忽悠,自己都感到惭愧,让猫哥见笑了,添麻烦了,哈哈

不懂unsigned long 更没接触到_int64是什么东东,main(int argc, char **argv)也不熟悉,彻底完蛋..好了,言归正传

我看了heibird,scanf的代码和hotzenlotz的代码
heibird,scanf都是以2*F[i]为基准展开,如果大于就输出2,小于而且大与F[i]就输出1否则输出0

hotzenlotz的代码其实也是以2*F[i]为基准,只是在减的过程中如果碰到2就要多++一次,比如36的话,36-17>17就要++变成2,说到底思路是不尽相同的

但是为什么在1922337203685477580这个数据测试的时候heibird,scanf会出现错误的答案!!

       

6 楼

to xieyong456:
汗一个,连我名字也打错了,不过我也把确实打成确定了。
水平差不要紧,我也不会写main(int argc, char **argv),不过看了别人的程序就会了。
scanf的程序我看了一下,算法没错的话就是细节错了,找到这个Bug。
unsigned __int64 F[52]={...    0x6e923dd1,0x1af14fe3,0x28474dd97, .......}
其中0x1af14fe3似乎应该是0x10af14fe3。这个数字以后的数应该也都错了
而heibird则吃亏在了
int main(int argc, char *argv[])
{
  __int64 inputdata = strtol(argv[1],NULL,10);
............
}
上,strtol()函数的返回值为long型。

7 楼


我也说说感受把,比赛听激烈的,也很有意思,下次一定还要参加。

看到题目后想法有了,这么大的数据我用tc是处理不了了。
星期天去了卖碟的地方找了好多vc++,c++builder。还去书店借了书,后悔上学时候都没这么勤奋。

c++ 还不太会用,cout 就研究了好久。后来还是用tc实现的,测试数据就试验了168,0,1,2。只是最后交答卷时候把long 该为了 unsigned long long ,给搂主添麻烦了。

8 楼

To kofox:

cout不熟,可以用printf嘛,呵呵~~~!~



9 楼

我的大数是不行的~唉~

10 楼

unsigned __int64 F[52]={0,0x1,0x3,0x7,0x11,0x29,0x63,0xef,0x241,0x571,0xd23,0x1fb7,0x4c91,0xb8d9,0x1be43,0x4355f,0xa2901,0x188761,0x3b37c3,0x8ef6e7,0x1592591,0x3414209,0x7dba9a3,0x12f8954f,0x2dccd441,0x6e923dd1,0x1af14fe3,0x28474dd97,0x613db0b11,0xeac2af3b9,0x236c30f283,0x55848cd8bf,0xce754aa401,0x1f26f2220c1,0x4b3538ee583,0xb59163febc7,0x1b65800ebd11,0x4224165d65e9,0x9fadacc988e3,0x1817f6ff077af,0x3a2ac8caa7841,0x8c6d889456831,0x15305d9f3548a3,0x332793c7aff977,0x7b7f852e953b91,0x12a269e24da7099,0x2cfccc1784a1cc3,0x6c9c021156eaa1f,0x10634d03a3277101,0x27905a285bbd8c21,0x5f8401545aa28943,0xe6985cd111029ea7};

像scanf兄这些东东是什么意思?我没有接触过这方面的知识,请教了!谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册