【问题标题】:how to create alphabets like in excel coloumns如何在excel列中创建字母
【发布时间】:2013-06-19 07:29:39
【问题描述】:

我尝试创建一个字母系列,例如 a,b,c,...z,aa,ab,ac,ad,ae,af,...,az,ba,bb,bc,...,bz,..zz,aaa,aab,aac..up to given number(N)

但是当我尝试使用for loops 创建它时,我在元素中的每个第二个字符创建了一个for loop 这意味着打印 a..z - loop1, aafor each second letter like a ,我写了一个新的for循环

是否可以使用 for 循环创建这种类型系列...

提前谢谢...

【问题讨论】:

    标签: c# algorithm series


    【解决方案1】:

    这是怎么做的:

        public static string GetExcelColumnName(int index)
        {
            int d = index;
            string name = "";
            int mod;
    
            while (d > 0)
            {
                mod = (d - 1) % 26;
                name = Convert.ToChar('a' + mod).ToString() + name;
                d = (int)((d - mod) / 26);
            }
    
            return name;
        }
    
        public static IEnumerable<string> GetExcelColumns(int n) {
            for (int i = 1; i <= n; i++)
            {
                yield return GetExcelColumnName(i);
            }
        }
    
        static void Main(string[] args)
        {
            int i = 1;
            foreach (var item in GetExcelColumns(900))
            {
                Console.Write(i++ + ": " + item + " ");
            }
            Console.WriteLine();
        }
    

    GetExcelColumnName的解释:

    //Suppose index = 1, `GetExcelColumnName` should return `"a"`.
        d = 1
        d > 0
            mod = (d - 1) % 26; //mod now is 0
            Convert.ToChar('a' + mod); // => That's 'a'
            //name now is "a"
            d = (d - mod) / 26 = (1 - 0) / 26 = 0 // d is now 0
        //End of While
        method returns "a"
    
    //Suppose index = 28, `GetExcelColumnName` should return `"ab"`.
        d = 28
        d > 0
            mod = (d - 1) % 26; //mod now is 1 (27 modulo 26)
            Convert.ToChar('a' + mod); // => That's 'b'
            //name now is "b"
            d = (d - mod) / 26 = (28 - 1) / 26 = 1 // d is now 1
        d > 0
            mod = (d - 1) % 26; //mod now is 0 (0 modulo 26)
            Convert.ToChar('a' + mod); // => That's 'a'
            //name now is "ab"
            d = (d - mod) / 26 = (1 - 0) / 26 = 0 // d is now 0
        //End of While
        method returns "ab"
    

    【讨论】:

    • 我无法理解这个,对不起麻烦你可以添加cmets或提供其他解决方案....
    • 你到底有什么不明白的?
    • 我无法理解这一点,public static string GetExcelColumnName(int index) { int d = index; string name = ""; int mod; while (d &gt; 0) { mod = (d - 1) % 26; name = Convert.ToChar('a' + mod).ToString() + name; d = (int)((d - mod) / 26); } return name; }
    【解决方案2】:

    这对于列表和推导非常简单

    例如在python中

    alpha = ['a','b','c','d','e','f','g','h','i']
    
    def merge(x,y):
        new = [ a+b for a in x for b in y]
        return new 
    
    print(merge(alpha,alpha))
    print(merge(alpha,merge(alpha,alpha)))
    

    会给你你想要的。在 C# 中,您可以找到等效的(或在 F# 中)

    【讨论】:

      【解决方案3】:

      我认为正确看待这个问题的方法是,以 27 为底的数字,并用 0 跳过所有数字。您的数字是 _abcdefghijklmnopqrstuvwxyz(_ 的值为 0,z 的值为 26),然后您创建基数为 27 的数字是这样的:

      nums_generated = 0
      next_num = 1
      while nums_generated < N:
         number_string = generate_base_27(next_num)
         if not '_' in number_string:
             print number_string
             num_generated = num_generated + 1
         next_num = next_num + 1
      

      这应该可以解决问题。要使用给定字符集创建以 27 为基数的数字,请查找例如 here ,并根据需要以 27 为基数进行适当的更正。

      【讨论】:

      • 如果可能请用c#给出解决方案
      • 这是伪代码,也恰好是合法的 Python。将其转换为 C# 应该非常简单。如果您对转换有具体问题,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多