首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求一个算法

2013-02-28 
求1个算法有这样一个字符串输入:A000Z-B360Z输出 A000ZA001Z……A360ZB001ZB002Z……B360Z[解决办法]for (int

求1个算法
有这样一个字符串
输入:A000Z-B360Z

输出 
A000Z
A001Z
……
A360Z
B001Z
B002Z
……
B360Z

[解决办法]
for (int i = (int)s1[0]; i <= (int)s2[0]; i++)
    for (int j = int.Parse(s1.SubString(1, 3); j <= int.Parse(s2.SubString(1, 3); j++)
        Console.WriteLine(((char)i).ToString() + j.ToString().PadLenft(3, '0') + "Z");
[解决办法]
应该是变进制数的枚举。


using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //A000Z
            //A001Z
            //……
            //A360Z
            //B001Z
            //B002Z
            //……
            //B360Z
            var rad = new List<string[]>(3); //就把它当一个三位数,个位是1进制,十位360+1进制,百位2+1进制
            rad.Add(new[]
                    {
                        "A", "B"
                    });

            rad.Add(Enumerable.Range(0, 361).Select(i => i.ToString("000")).ToArray());
            rad.Add(new[]
                    {
                        "Z"
                    });

            foreach (var item in new VarNumberEnum(rad.ToArray()).Enum())
            {
                Console.Write(item + "\t");
            }

            //00A00-36B00
            rad.Clear();
            rad.Add(Enumerable.Range(0, 37).Select(i => i.ToString("00")).ToArray());


            rad.Add(new[]
                    {
                        "A", "B"
                    });
            rad.Add(Enumerable.Range(0, 100).Select(i => i.ToString("00")).ToArray());
            foreach (var item in new VarNumberEnum(rad.ToArray()).Enum())
            {
                Console.Write(item + "\t");
            }
        }
    }

    class VarNumberEnum //实现变进制数枚举
    {
        string[][] rad;

        public VarNumberEnum(params string[][] rad)
        {
            //if rad.length==0???  if rad[x]==0???
            this.rad = rad;
        }

        internal IEnumerable<string> Enum()
        {
            var enumerators = rad.Select(r => r.GetEnumerator()).ToArray(); //每个元素代表一“位”

            Array.ForEach(enumerators, enumerator => enumerator.MoveNext());

            //先返回第1个
            yield return string.Concat(enumerators.Select(e => e.Current));

            while (true)
            {
                for (var i = rad.Length - 1; i >= 0; i--)
                {
                    if (enumerators[i].MoveNext()) //+1成功,中止循环。+1不成功再从0开始并进位
                    {
                        break;
                    }
                    if (i == 0) //循环完了,中止
                    {
                        yield break;


                    }
                    enumerators[i].Reset();
                    enumerators[i].MoveNext();
                }
                yield return string.Concat(enumerators.Select(e => e.Current));
            }
        }
    }
}


[解决办法]
和我原来写的序号生成表达式有点类似啊。不过我用的是偏正则的方式:[00-30][A-C,Z][000-999]

简单提下我的思路,每个中括号里是一个范围表达式,分割计算每个表达式中的所有可能字符串,生成一个string[]。如上,就会有3个字符串数组,然后用递归的方式将3个字符串数组合并成一个

热点排行