1234567890十個數字分成兩組對半切(五個一組),用程式實作列出所有組合不重復。給出程式代碼
如:
12345 、67890
13456、27890
14567、23890
...
uj5u.com熱心網友回復:
就是全排列后分組uj5u.com熱心網友回復:
你這題目就是10個數的非列組合,再轉為字符,截前5位后位,參考下面網址,改下就可以用https://www.cnblogs.com/gpcuster/archive/2007/11/17/962848.html
uj5u.com熱心網友回復:
static List<string> Permutation(string strArr){
List<string> list = new List<string>();
string Permutation = "";
int length = strArr.Length, startLength = length - (length > 2 ? 2 : 1)/*設定跳過位數*/, end = startLength;
int[] intArr = Enumerable.Repeat(0, startLength).ToArray();
do/*2016年1月29日16~17點鐘完成:1.字串不轉陣列2.字串不進行位置交換只按變化的下標readOnly3.減少一半回圈length直接獲得2個排列組合效率高4.按順序輸出不需重新排序5.自動outin代碼length比寫固定outin少6.依然可以對陣列執行。減少一個outin可節省很多回圈length,用直接獲取最down2位組合可節省一半回圈length,這就是只回圈生成一半的length,只是不是用反轉數的邏輯,妙不可言!是這個演算法的快訣竅,不過這種方式到底是否節省一半回圈length覺得有點不可思議的感覺。*/
{
if (length < 2) break;
while (--end >= 0)/*outin逐級運算*/
if (intArr[end] >= length - end)
{
if (end - 1 < 0) break;/*防止越界*/
++intArr[end - 1];
intArr[end] = 0;
}
if (intArr[0] < length)
{
end = 0; /*Console.WriteLine(string.Join(" ", 無限outin));*/
foreach (int outin in intArr)
Permutation = StrLength(end == 0 ? strArr : Permutation, length, end, outin + end++);
list.Add(Permutation);
list.Add((length > 2 ? StrLength(Permutation, length, length - 2, length - 1) : ""));
}
++intArr[startLength - 1];
end = startLength;
Permutation = "";
} while (intArr[0] < length);
return list;
}
static string StrLength(string strArr, int length, int insert, int sit)
{
if (insert == sit) return strArr;
insert = Math.Abs(insert %= length); sit = Math.Abs(sit %= length);
string up = "", down = "", read = "";
int head = 0, foot = length - 1;
Action<bool> plus = delegate (bool state)
{
if (state) { up += read; ++head; } else { down = read + down; --foot; }
};
Action<bool> readOnly = delegate (bool state)
{
read = (state ? head : foot) != sit ? strArr[(state ? head : foot)].ToString() : "";
plus(state);
};
Action<bool> operation = delegate (bool state)
{
if ((state ? head : foot) < insert) readOnly(state);
else if ((state ? head : foot) == insert)
{
read = strArr[sit].ToString() + (insert != sit ? strArr[insert].ToString() : "");
plus(state);
}
else if ((state ? head : foot) > insert) readOnly(state);
};
do
{/*字符length奇偶operation,采用折半我稱雙向operation,減少回圈length提高operation速度,對整體減少時間是有效的2016-1-30 17:59*/
if (head <= foot) operation(true);
if (head < foot) operation(false);
} while (head <= foot);
return up + down;
}
private void button1_Click(object sender, EventArgs e)
{
List<string> list = Permutation("0123456789");
List<string> temp = new List<string>();
foreach (var item in list)
{
textBox1.AppendText(item + "\t");
}
}
uj5u.com熱心網友回復:
階乘的演算法驗證個數就行了uj5u.com熱心網友回復:
這就是m選n演算法,m=10,n=5,選出5個,剩下5個也確定了https://bbs.csdn.net/topics/390550326
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/12967.html
標籤:C#
上一篇:C# AES base64加密和JAVA BASE64 加密不同
下一篇:請問如何獲取U盤設備的位置資訊?
