将输入的字符串进行排列组合,不允许重复,并将每种组合以及组合总数输出出来,要求用java。
这里没有输出publicstaticlongGetA(intm,intn)//组合数C(n,m){longnum=-1;if(m>=n&&n>=0&&m>0){num=1...
这里没有输出
public static long GetA(int m, int n)//组合数C(n,m)
{
long num = -1;
if (m >= n && n >= 0 && m > 0)
{
num = 1;
for (int i = 0; i < n; i++)
{
num *= m - i;
}
return num;
}
return num;
}
public static long GetCombinationCount(String input)//返回组合数
{
long count;
if (input == null)
count = -1;
else if (input.isEmpty())
count = 0;
else
{
int length = input.length();
if (length > 25)
count = -1;
else
{
Hashtable<Character,Integer> hash = new Hashtable<Character, Integer>();
char itemKey ;
for(int i = 0;i<input.length();i++)
{
itemKey = input.charAt(i);
if (!hash.contains(itemKey))
hash.put(itemKey, i);
else
i++;
}
count = GetA(length, length);
if(hash.size() != length){// if figure reduplicated 如果有重复的话(这个可能
//完全不对)
Enumeration hashtable = (Enumeration) hash.elements();
while(hashtable.hasMoreElements()){
Collection<Integer> temp = ((Hashtable<Character, Integer>) hashtable).values();
if(!temp.toString().equals(Integer.valueOf(1).toString())){
int last = Integer.parseInt(temp.toString());
count /= GetA(last, last);
}
}
}
这个问题比较多,如果觉得有更好的办法 可以完全抛弃我这种。
如:输入abc,则有abc,acb,bac,bca,cab,cba共6中排列组合。若输入aab,则有aab,aba,baa三种排列。 展开
public static long GetA(int m, int n)//组合数C(n,m)
{
long num = -1;
if (m >= n && n >= 0 && m > 0)
{
num = 1;
for (int i = 0; i < n; i++)
{
num *= m - i;
}
return num;
}
return num;
}
public static long GetCombinationCount(String input)//返回组合数
{
long count;
if (input == null)
count = -1;
else if (input.isEmpty())
count = 0;
else
{
int length = input.length();
if (length > 25)
count = -1;
else
{
Hashtable<Character,Integer> hash = new Hashtable<Character, Integer>();
char itemKey ;
for(int i = 0;i<input.length();i++)
{
itemKey = input.charAt(i);
if (!hash.contains(itemKey))
hash.put(itemKey, i);
else
i++;
}
count = GetA(length, length);
if(hash.size() != length){// if figure reduplicated 如果有重复的话(这个可能
//完全不对)
Enumeration hashtable = (Enumeration) hash.elements();
while(hashtable.hasMoreElements()){
Collection<Integer> temp = ((Hashtable<Character, Integer>) hashtable).values();
if(!temp.toString().equals(Integer.valueOf(1).toString())){
int last = Integer.parseInt(temp.toString());
count /= GetA(last, last);
}
}
}
这个问题比较多,如果觉得有更好的办法 可以完全抛弃我这种。
如:输入abc,则有abc,acb,bac,bca,cab,cba共6中排列组合。若输入aab,则有aab,aba,baa三种排列。 展开
2个回答
展开全部
以下是C#的源码:包括计算相同的两位数,不同的三位数,和相同的三位数的个数,以及组合的方式,我是写的1-?中的数的组合方式,?由用户输入,你可以换成用数组保存输入的数,用下标就可以把123换成你的abc,至于输入aab得到3种排列,如果你能明白我写的这个,应该就能知道怎么写你想要的,你运行看看吧,如果不能自己动脑写出来,再追问吧!(补充一下,我没看到你是要java的,原理都一样 就输入和显示语法不同,你需要的话 可以给你改改)
using System;
using System.Collections.Generic;
using System.Text;
namespace 三位数
{
class Program
{
public static int d;
public static int num,dnum;
static void Main(string[] args)
{
while (true)
{
Program n = new Program();
Console.WriteLine("请输入1到多少的数组成三位数:");
d = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("======================");
Console.WriteLine("请选择查看的内容:");
Console.WriteLine("1.不同的三位数");
Console.WriteLine("2.两位数相同的三位数");
Console.WriteLine("3.三位数的相同的三位数");
Console.WriteLine("4.退出");
int x = Convert.ToInt32(Console.ReadLine()); ;
switch (x)
{
case 1:
{
n.difcount();
n.three();
break;
}
case 2:
{
n.Doucount();
n.Double();
break;
}
case 3:
{
n.triplenum();
break;
}
case 4:
{
Console.WriteLine("确认退出?(Y/N)");
Console.WriteLine("Y.退出");
Console.WriteLine("N.返回");
ConsoleKeyInfo key = Console.ReadKey();
if (key.Key == ConsoleKey.Y)
{
return;
}
else
{
Console.WriteLine();
break;
}
}
}
}
}
//组成的不同的三位数
public void three()
{
Console.Write("能组成{0}个不含相同数字的三位数,分别为", num);
Console.ReadLine();
int m = 0;
for (int i = 1; i <= d; i++)
{
for (int j = 1; j <= d; j++)
{
for (int k = 1; k <= d; k++)
{
if (k != i && k != j&&i != j)
{
Console.Write("{0}{1}{2}"+" ", i, j, k);
m++;
if (m == num / d)
{
Console.WriteLine();
m = 0;
}
}
}
}
}
}
//不同的三位数的个数
public void difcount()
{
num = 1;
for (int i = d; i >= d-2; i--)
{
num *= i;
}
//Console.WriteLine(num);
}
//相同的三位数级个数
public void triplenum()
{
Console.Write("能组成相同的三位数的个数为:{0},分别为",d);
Console.ReadLine();
for (int i = 1; i <= d; i++)
{
Console.WriteLine("{0}{1}{2}"+" ",i,i,i);
}
}
//相同的两位数
public void Double()
{
Console.WriteLine("能组成{0}相同的两位数的值为:",dnum);
for (int i = 1; i <= d; i++)
{
for (int j = 1; j <= d; j++)
{
for (int k = 1; k <= d; k++)
{
//ijk
if ((i == j && i != k) || (i == k && i != j) || (j == k && j != i))
{
Console.Write("{0}{1}{2}"+" ",i,j,k);
}
}
}
Console.WriteLine();
}
}
//相同的两位数的个数
public void Doucount()
{
dnum = (d * d - d) / 2*6;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace 三位数
{
class Program
{
public static int d;
public static int num,dnum;
static void Main(string[] args)
{
while (true)
{
Program n = new Program();
Console.WriteLine("请输入1到多少的数组成三位数:");
d = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("======================");
Console.WriteLine("请选择查看的内容:");
Console.WriteLine("1.不同的三位数");
Console.WriteLine("2.两位数相同的三位数");
Console.WriteLine("3.三位数的相同的三位数");
Console.WriteLine("4.退出");
int x = Convert.ToInt32(Console.ReadLine()); ;
switch (x)
{
case 1:
{
n.difcount();
n.three();
break;
}
case 2:
{
n.Doucount();
n.Double();
break;
}
case 3:
{
n.triplenum();
break;
}
case 4:
{
Console.WriteLine("确认退出?(Y/N)");
Console.WriteLine("Y.退出");
Console.WriteLine("N.返回");
ConsoleKeyInfo key = Console.ReadKey();
if (key.Key == ConsoleKey.Y)
{
return;
}
else
{
Console.WriteLine();
break;
}
}
}
}
}
//组成的不同的三位数
public void three()
{
Console.Write("能组成{0}个不含相同数字的三位数,分别为", num);
Console.ReadLine();
int m = 0;
for (int i = 1; i <= d; i++)
{
for (int j = 1; j <= d; j++)
{
for (int k = 1; k <= d; k++)
{
if (k != i && k != j&&i != j)
{
Console.Write("{0}{1}{2}"+" ", i, j, k);
m++;
if (m == num / d)
{
Console.WriteLine();
m = 0;
}
}
}
}
}
}
//不同的三位数的个数
public void difcount()
{
num = 1;
for (int i = d; i >= d-2; i--)
{
num *= i;
}
//Console.WriteLine(num);
}
//相同的三位数级个数
public void triplenum()
{
Console.Write("能组成相同的三位数的个数为:{0},分别为",d);
Console.ReadLine();
for (int i = 1; i <= d; i++)
{
Console.WriteLine("{0}{1}{2}"+" ",i,i,i);
}
}
//相同的两位数
public void Double()
{
Console.WriteLine("能组成{0}相同的两位数的值为:",dnum);
for (int i = 1; i <= d; i++)
{
for (int j = 1; j <= d; j++)
{
for (int k = 1; k <= d; k++)
{
//ijk
if ((i == j && i != k) || (i == k && i != j) || (j == k && j != i))
{
Console.Write("{0}{1}{2}"+" ",i,j,k);
}
}
}
Console.WriteLine();
}
}
//相同的两位数的个数
public void Doucount()
{
dnum = (d * d - d) / 2*6;
}
}
}
追问
你能用java再给我弄下么?因为别人也给我弄过c#的,如果要用c#,我就不来提问了 。真是不好意思啊 ,麻烦你了啊!
追答
今天白天比较忙,晚上我有时间就写给你吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询