Excel列编号(序号A、B、C…AA、AB…)英文字母字符生成算法备忘

近期很忙,博客也不怎么更新了,这里记录一个Excel扩展项目中的列编号生成算法实现。在VBA中,Excel的行可以是1、2、3、4、5…,但是Excel的列编号却是形如A、B、C…AA、AB…BA这样的编号模式,我期望将1、2、3、4、5转换为对应的Excel列编号,但对于我这种不太喜欢钻研算法的来说,确实有点棘手。

不过硬着头皮写了一段,并且也勉强能用,代码分享如下:

/**
*
*  buffer 字符缓冲区,用来存储A、B..AA..BB这样的转换结果
*  cch    字符缓冲区容量,最多可以容下字符数
*  num    表示要转换的数值数据
**/
char *TranslateToColumnName(char *buffer, int cch, int num)
{
    const int factor = 26;
    int f1 = (num) / (factor);
    int f2 = (num+1) - (f1) * factor;
    memset(buffer, 0, cch * sizeof(char));
 
    if (f1 == 0) {
        buffer[0] = 'A'+(f2-1);
        buffer[1] = '\0';
    } else {
        buffer[0] = 'A'+(f1-1);
        buffer[1] = 'A'+(f2-1);
    }
    return buffer;
}

有一天我在网上看到了现成的算法《如何将 Excel 列号转换为字母字符》,竟然还是微软官方提供的,看来我是重复造了一个轮子,微软的代码如下(VB实现):

继续阅读

Python计算并按比例获取随机票数

之前做的一个计票程序,需要用随机票数对程序进行样本测试,当然为了使测试接近于真实情况,对于三种投票结果(赞成、反对、弃权)按比例进行适当的调整。

下面我使用Python简单阐述一下这个简单的算法,首先获取一个随机票数,可以简单的通过随机一定范围的数字来实现,这个用Python实现比较简单,可以import random,然后通过random.randint(下限, 上限)来产生。我们可以先通过IDLE下面的脚本来查询使用方法:

import random
help(random.randint)
# -- output --
# Help on method randint in module random:
#
# randint(self, a, b) method of random.Random instance
#    Return random integer in range [a, b], 
#      including both end points.

继续阅读

采样分类统计法计算分组票数

文章仅供参考

今天单位要求计票,近100个人,几千张选票,每张选票上有1~12人不等,选票内容有两大类,一类分为同意和不同意,一类分为优秀、称职、比较称职和不称职这几个选项,要求分别算出这些人两大类的选票数。

杯具的是,原始的选票,木有计算机啊,再NB的程序也派不上用场了,只有手工计票了,和同事讨论的几种计票方法,同事给出的意见是:先选择选票上第一个人,然后分别筛出得票最多的选项,比如说,这一堆选票,每张有张三、李四和王五三个人,首先选择张三,大概看了一下,发现张三得同意和优秀的票最多,我们把这些票筛选出来,然后统计不是这两个选项的票,这里只能采用笨方法,依次遍历两大类的各选项。这样发现计票确实容易了一些,因为大多数票已经被筛出了,然后数一下筛出的票数,再合计就得出了张三的所有选项的票数。

下午,同事有事外出,我单独找了一间大的会议室,然后准备计票,突然想到计算机上典型的以空间换时间的算法,也就是说时间快效率高,多数是以牺牲空间为代价的,典型的就是缓存,我们将经常会访问的数据存放在缓存里,这样可以避免多次查询数据库所带来的性能开销,访问的速度就会变快,而这个速度是要牺牲内存或者硬盘空间的;相反,如果空间小,更多地是要消耗性能,导致速度瓶颈的。

那么我又研究了一下刚才同事提出的思路,然后实际计了一组选票,得出以下结论:

1. 全部选择同意和优秀的比较多排第一,这类人多数对投票不感兴趣、不敢得罪人或者是不认识被选举人。

2. 全部选择同意和称职的人数排第二,这类人多数具备有第一条所述的特点,同时思想略有保守,对优秀比较感冒,或者本人要求比较严格,无论看什么都是有缺点的。

3. 全部选择不同意和称职的人数居第三,这类人多数原则上不想被选举人当选,既然不想被选举人当选,那么“优秀”就无从谈起,接下来就是“称职”、“比较称职”和“不称职”三种说法,既然选择不同意,可能觉得被选举人缺乏职务升迁的某种能力,但是对于其工作还是认可的,所以选择称职。

继续阅读