求高效的2-6位字符串穷举程序代码,请一份 完整搞笑的C#代码,100分送上谢谢
解决方案 »
- Remoting应用的一些问题
- 有两个关于SOCKET的问题请教。
- 在winform中如何返回datetimepicker的日期和时间值?
- 各位高手,怎样从数据库中取出值后根据一个字段的值判断DataList中的RadioButtonList的Selected应该为真还是假
- 我做了一个dll。但为什么public方法无法调用啊?
- 文件流输出文件并下载
- 关于Eval()控件的用法,求大神解答
- WPF datagrid单元格选择问题
- 字符串变量的结尾包含许多空字符“\0”,如何去掉这些空字符????????????????????????
- 请问怎么用C#来实现清除SSL状态的功能??
- 播放MP3文件,怎么编程显示播放时间
- 大家帮我看下这个DBHelper类写对了没有???
例如:aaa,aab,aac,aad...aba,abb,abc,abd...zzx,zzy,zzz
我所谓的穷举就是这个意思.
我想要的就是aa-zzzzzz这个范围内所有字母的全排列.
想找一个效率相对较高的算法.请高手赐教.....
结果在内存很容易溢出,所以结果直接写入一个文本文件了。
下面是我以前写的一个算法,首先是正确的,是不是效率最高不知道,你可以试试能否找出效率更高的来。
private void button1_Click(object sender, EventArgs e)
{
Char[] chr = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ".ToCharArray(); // 自已再往里补充吧 File.WriteAllText(@"C:\file0.txt", "", Encoding.Default);
for (int i = 0; i < chr.Length; i++) // 取 i个字符长度
{
StreamReader sr = new StreamReader(@"C:\file" + i + ".txt", Encoding.Default);
StreamWriter sw = new StreamWriter(@"C:\file" + (i + 1) + ".txt", false, Encoding.Default);
string str = "";
while (true)
{
str = sr.ReadLine();
if (str == null && i != 0) { break; }
if (i == 0) { str = ""; }
for (int j = 0; j < chr.Length; j++)
{
sw.WriteLine(str + chr[j].ToString());
}
if (i == 0) { break; }
}
sr.Close();
sw.Close();
}
if (i == 3) break; //计算到第4位
}(1)为了便于测试用了i个文件分别存结果
file1.txt 1个字符
file2.txt 2个字符
file3.txt 3个字符
................. (2)读上一个文件的每行,分别加上chr[]中的每个字符,写到下一个文件。 (3)为了使结构更清晰,开始写了个空文件 file0.txt
=〉
事先初始化一个巨大的数组你要的是穷举的效率,
初始化不算在内,直接用char多重循环就可以了
数组放不下,可以用多个文件~
{
static void Main(string[] args)
{
PWD();
} static public string PWD()
{
char[] chars = "0123456789abcdefghijklmnopqrstuvwxyz".ToCharArray();
int maxlength = 6;
int minlength = 2;
Random ran = new Random();
while (true)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < ran.Next(minlength, maxlength); i++)
{
sb.Append(chars[ran.Next(chars.Length - 1)]);
}
Console.WriteLine(sb.ToString()+Environment.NewLine);
}
}
}
我要得相当于密码字典这样一个结果,你的代码会出现相同的字符串。
答:建议用二进制方式读写,因为a到z在ASCII的范围内,可以用byte来编码的;数据结构当然是用数组
using System;
using System.Windows.Forms;class 这是一份完整搞笑的代码
{
static void Main()
{
for(;;)
MessageBox.Show("真的很搞笑");
}
}
够完整 够搞笑吧
我说过很多次了,字典生成只需要一次,下次你只要copy这个文件就可以了~
说了那么多,都是对牛弹琴啊
让用户等待?
你直接把一次性生成的字典文件copy就是了,为啥要每次重新生成呢?
你认为如下这样写效率不高吗?
以下代码只写了2位的,3到6位只要复制中间的把2改为相应数字即可StreamWriter sw = new StreamWriter(@"C:\word.dic");
char[] chars = new char[2];
for (char c1 = 'a'; c1 <= 'z'; c1++)
{
chars[0] = c1;
for (char c2 = 'a'; c2 <= 'z'; c2++)
{
chars[1] = c2;
sw.WriteLine(new string(chars));
}
}
sw.Close();
3到6位不仅要把2改为相应数字,还要增加循环,如6位就要六重循环
如果你还嫌效率不够高,可以使用unsafe代码,或者直接用C++来写
简单的多重循环而已~
代码就不写了