delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

11 Apr 2008

挑战:算法挑战 36进制 条码序列号 生成器

好久没做编码方面的东西了,今天在 火星 上看到一个挑战,一时兴起就做了一下。原题请看 这里

既然是挑战,我目前的算法对于每个数来说都是常数时间,欢迎大家继续拍砖,我的代码2天后公布(我用的是C语言,大家自便)。

#include <stdio.h>
#include <stdlib.h>

static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

int
main(void)
{
        int i;

        /* 000 - 999 */
        for (i=0; i<=999; i++)
                printf("%03d\n", i);

        /* 1000 - 3599 (26*100=2600 total) */
        for (; i <= 3599; i++)
                printf("%c%02d\n", alphabet[(i-1000)/100], i%100);

        /* 3600 - 12959 (36*26*10 = 9360 total) */
        for (; i <= 12959; i++)
                printf("%c%c%d\n", alphanum[(i-3600)/260],
                    alphabet[((i-3600)/10)%26], i%10);

        /* 12960 - 46655 (36*36*26 = 33696 total) */
        for (; i <= 46655; i++)
                printf("%c%c%c\n", alphanum[(i-12960)/936],
            alphanum[((i-12960)/26)%36], alphabet[(i-12960)%26]);

        return 0;
}

Archived: 8 Comments

HarbinBeer | April 11, 2008 3:29 PM

我只会汉语-__-!

loader | April 11, 2008 7:50 PM

只有在百位将Z用完后才允许在十位使用字母,十位用完才允许个位使用字母
用36进制的话3位可以表示36*36*36=46656个数字

只有百位用完Z后十位才引入字母,
那么只有36*10*10+36*10+36种可能了啊。。。

kxn | April 11, 2008 11:41 PM

Orz… 你还真跟 Joke 们死磕。。

slackcode | April 12, 2008 2:37 PM

我想的算法也是线性时间的,开销是if分支和整除与求余

Xin LI | April 15, 2008 3:01 AM

那是,要是有坏人乱写乱画不是把我给害了……

yc | April 15, 2008 2:42 PM

只是想拜拜delphij老大

neogui | April 16, 2008 8:27 AM

膜拜下… Orz

马甲1号 | April 25, 2008 8:32 PM

哈尔滨啤酒抢我的沙发啊!