详尽分享计算一个数字有多少种排列可能

简介: 详尽分享计算一个数字有多少种排列可能

现有一数字,例如12345,问这个数字有多少种排列可能,最简单的就是位数的阶乘,5位数字等于54321=120,这是理论上没有重复数字的情况下,如果现在是11234,11123,11112,11223有重复数字组成的数字怎么计算呢?

若一个数字由所有不相同的数字组成,则该数字的排列可能是该数组位数的阶乘,若该数字中存在重复的数字,例如,有m个1相同,结果就是n! / m!,n值是数字的位数,如果还存在p个相同的数字,那结果就是n! / m! /p!

根据上面的算法,上面的数字计算如下:

11234=5! / 2!=60

11123=5! / 3!=20

11112=5! / 4! = 4

11223=5! / 2! / 2! = 30

附上C#实现

public class MathHelper

{

///

/// 输入一个数字,算出该数值有多少种排列可能.

///

///

The num.

///

public static long CountPermutation(long num)

{

string number = num.ToString();

IDictionary[/span>char, intchar, int

foreach (char ch in number)

{

if (rptNum.Keys.Where(it => it == ch).Count()

rptNum【ch】 += 1;

else

rptNum.Add(ch, 1);

}//代码效果参考:http://www.ezhiqi.com/zx/art_3842.html

long totalFac = Factorial(number.Length);

foreach (var item in rptNum.Where(it => it.Value

{

totalFac /= Factorial(item.Value);

}

return totalFac;

}

///

/// 计算阶乘.

///

///

The num.

///

public static long Factorial(int num)

{

if (num == 1) return num;

return num * Factorial(--num);

}

}

输出数字的全排列

上面计算出了一个数字有多少种排列可能,下面就要分别列出这些排列结果!网上已经有了很多的算法,最基础的还是迭代循环,但数字一大效率是一个问题,另外一点就是无法去除重复数字,例如计算1123,1122这样数字的全排列结果的时候,本人数学不太好,索性,在博客园找到一个同学的实现:

一组数字的全排列按序输出

再议“生成全排列算法”

通过第一个同学的思路和实现,完成了一个C#版本,对于低数位的数字来说效率还是挺不错的,性能方面的测试我就先偷个懒,目前先应用上就行,毕竟目前这个实现已经满足我的需求了,呵呵!

C#实现

///

/// 全排列算法类

///

public class FullArrangementHelper

{

private int _length;

public IList[/span>long

public FullArrangementHelper()

{

Result = new List/span>long<span style="color: rgba(232, 226, 183, 1)";

}//代码效果参考:http://www.ezhiqi.com/zx/art_3780.html

public IList[/span>long

{

string numStr = num.ToString();

int【】 nums = new int【numStr.Length】;

for (int i = 0; i < numStr.Length; i++)

nums【i】 = int.Parse(numStr【i】.ToString());

_length = nums.Length;

nums = nums.OrderBy(it => it).ToArray/span>int<span style="color: rgba(232, 226, 183, 1)";//排序

FullArrangement(nums, 0);

return Result;

}

///

/// 计算全排列算法

///

///

要计算全排列的数字.

///

开始计算排列的位置,例如,现在的数字是1234,如果pos为0,就代表计算这四位的全排列,1的下标为0,

/// 如果为1,则计算后3位的全排列,依次下推.

private void FullArrangement(int【】 nums, int pos)

{

//将现在的数字添加到结果中

Result.Add(ConvertToNum(nums));

//最大是数字的长度-2是因为按照下标计算,此处pos-1是因为后续的步骤中需要+1来对相邻的两个数字做比较

for (int i = _length - 2; i

NextArrangement(nums, i);

}

///

/// 计算下一轮全排列

///

///

数字的分解数组.

///

开始计算排列的位置.

private void NextArrangement(int【】 nums, int pos)

{

int【】 cop = new int【_length】;

//根据下标依次计算数字的全排列,实际就是大排列都由小排列一步步扩大

for (int i = pos + 1; i < _length; i++)

if (nums【i】

{

for (int t = 0; t < _length; t++)

cop【t】 = nums【t】;

//交换数字位

for (int j = i; j

{

int temp = cop【j】;

cop【j】 = cop【j - 1】;

cop【j - 1】 = temp;

}

FullArrangement(cop, pos + 1);

}

}

private long ConvertToNum(int【】 nums)

{

StringBuilder sb = new StringBuilder();

foreach (var n in nums)

sb.Append(n);

return long.Parse(sb.ToString());

}

}//代码效果参考:http://www.ezhiqi.com/bx/art_5625.html

作者:空逸云

出处:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

您的支持是我前进的动力,请猛击.:

相关文章
|
5月前
|
Python
用四个数字实现不重复的三位数如何用python实现
主要是利用三个循环,三个嵌套循环让三个数字组合,如果是三个不同的数字就可以打印出来,同时用一个sum来统计他们的个数,最后将print置于最右打印出总数。
|
4月前
|
算法 C#
详尽分享计算一个数字有多少种排列可能
详尽分享计算一个数字有多少种排列可能
25 0
|
10月前
|
算法 测试技术 C#
C++二分查找算法:最大为 N 的数字组合
C++二分查找算法:最大为 N 的数字组合
|
11月前
|
算法
代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串
代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串
39 0
|
Shell Perl
2、计算文档每行出现的数字个数,并计算整个文档的数字总数
2、计算文档每行出现的数字个数,并计算整个文档的数字总数
67 1
|
算法 Java 网络架构
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
|
Python
【python实战】top1 数字组合——有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
【python实战】top1 数字组合——有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
584 0
【python实战】top1 数字组合——有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
排序数组中只出现一次的数字(中等难度,三种方法)
排序数组中只出现一次的数字(中等难度,三种方法)
108 0
排序数组中只出现一次的数字(中等难度,三种方法)
|
算法 索引
数组中重复的数字(简单难度)
数组中重复的数字(简单难度)
81 0
数组中重复的数字(简单难度)
|
Java 测试技术
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
192 0
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3