求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));
}
}
}
}