zoukankan      html  css  js  c++  java
  • 算法题:用php生成excel列

    题目:

    用php生成excel列
    型如:
    A B C D E …… Z AA AB AC AD………AZ BA BB BC BD………BZ………ZZ AAA AAB …………
    比如给一个参数27
    返回AA

    分析:
    本题重点是观察和联想,事实上我总结凡是算法题一般都可以很轻易的写出一种常规算法。但经过观察和联想,或辅以图形分析,都会有意想不到的收获。

    本题我的分析思路是,首先在纸上写画这个序列,很快可以想到26这个关键点,然后将序列分组,可以看出每组是按照等比数列展开的。那么通过给出的位置参数,我就能知道这个位置上的值是多少位的,这是我的第一个结论,在我的算法中有提现。

    然后看每一位的变化规律,你会发现都是AAA...到ZZZ...的形式,这像什么,像不像000...到999...,是的,这是我的第二个结论,每组序列都是按照值从低到高的顺序排列的,只不过进制是26进制。进而我采用了php的进制函数来做这件事。

    进制和实际叫法的关系形如我们把1,2,3叫做一,二,三,这里,我们就是将0,1,2处理成A,B,C。

    我的算法:我的算法不是很长,独立的语句我给写到一块了,但是不难理解,主要代码就4行,:)。
    view plaincopy to clipboardprint?
    <?php  
    function getExcelValue($index)  
    {  
        $index = (int)$index;if ($index <= 0) return; //输入检测  
        $dimension = ceil(log(25 * $index + 26, 26)) - 1;  //算结果一共有几位,实际算的是位数减1,记住是26进制的位数  
        $n = $index - 26 * (pow(26, $dimension- 1) - 1) / 25; //算结果在所在位数总数中排第几个  
        $n--; //转化为索引  
       
        return str_pad(  
            str_replace(  
                array_merge(range(0, 9), range('a', 'p')),   
                range('A', 'Z'), base_convert($n, 10, 26)  
            ), $dimension, 'A', STR_PAD_LEFT  
        ); //翻译加补齐  

    <?php
    function getExcelValue($index)
    {
        $index = (int)$index;if ($index <= 0) return; //输入检测
        $dimension = ceil(log(25 * $index + 26, 26)) - 1;  //算结果一共有几位,实际算的是位数减1,记住是26进制的位数
        $n = $index - 26 * (pow(26, $dimension- 1) - 1) / 25; //算结果在所在位数总数中排第几个
        $n--; //转化为索引
     
        return str_pad(
            str_replace(
                array_merge(range(0, 9), range('a', 'p')),
                range('A', 'Z'), base_convert($n, 10, 26)
            ), $dimension, 'A', STR_PAD_LEFT
        ); //翻译加补齐
    }

    参考算法:原解法是递归的思路,也比较巧妙,但递归方式不太好理解。而且如果批量输出序列需要重新初始化字符串。

    $array = range('A', 'Z');
    $str = ''; 
    function test($num)
    {
        global $array, $str;
     
        if ($num >= 26) {
            $str = $array[$num%26] . $str;
            test(intval($num /= 26) - 1);
        } else {
            $str = $array[$num] . $str;
        }
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iminto/archive/2009/08/24/4479158.aspx

  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/lost0/p/1765298.html
Copyright © 2011-2022 走看看