关于组合数的小程序


/*第二题
* 从图中,我们可以发现26个字母分布在2-9这8个数字键上。某人的电话号码是65967427,观察单词“olympics”,
* 可以发现:字母o位于数字键6上,字母l位于数字键5上,…字母s位于数字键7上。此时,我们说olympics是65967427对应的一个字母组合。
*65967427还可以对应其它很多种字母组合,例如:mjwmpgap也是其中之一。输入为一个电话号码(允许输入为3位到11位的十进制数),
* 在控制台输出该数字对应的所有字母组合,并返回组合的总数。如果数字中包含1或者0,由于没有与之对应的字母,则直接返回0。当数字小于3位或者大于11位时 ,
*亦没有对应字母组合,返回0。 
* */
import java.util.*;
import java.io.*;

class MyMap//定义MyMap类将手机健数字对应的字母存入HashMap中
{
	private HashMap<Integer,String> hm = new HashMap<Integer,String>();

	public MyMap()
	{
		hm.put(2,"abc");
		hm.put(3,"def");
		hm.put(4,"ghi");
		hm.put(5,"jkl");
		hm.put(6,"mno");
		hm.put(7,"pqrs");
		hm.put(8,"tuv");
		hm.put(9,"wxyz");
	}
	public HashMap<Integer,String> getHm()
	{
		return hm;
	}
}
class Second
{
	public static void main(String[] arge) 
	{
		InputStream in = null;
		String s2 = "";
		int s = 0;
		
		//输入读取
		sop(6789);
		PrintCombination("6789");
		try
		{
			in = System.in;
			sop("上面的做个示范\n\n请输入电话号码");
			while((s=in.read())!='\r')
			{
				s2=s2+String.valueOf((char)s);
			}
		}
		catch(IOException e)
		{
			sop(e.toString());
		}
		
		PrintCombination(s2);
	}
	public static int  PrintCombination(String s)
	{
		MyMap mm = new MyMap();
		HashMap<Integer,String> a2= new HashMap<Integer,String>();
		String str3 = "";
		String str2 = "";
		
		int IntSum = 1;
		int[] Num ={0,0,0,0,0,0,0,0,0,0,0};//存储每一个字符串当前应该打印的角标
		//建立一个标志位
		boolean[] flag = {false,false,false,false,false,false,false,false,false,false,false};	
		
		if(s.length()>11||s.length()<3)//判断是否是大于11小于3
		{								//如果不是则返回0
			sop("输入数据不合法输入数据必须为大于3小于11");
			return 0;
		}
		if(s.contains("1")||s.contains("0"))//判断是否存在0和1;
		{									//存在返回0;
			sop("输入数据不合法数据不应包含1或者0");
			return 0;
		}
		for(int i=0;i<s.length();i++)//遍历输入的字符串将结果存入a2,同时计算有多少种排列方式存入IntSum中
		{
			//将数字对应的的字母存入al中
			int a = Integer.parseInt(s.substring(i,i+1));
			String sTemp = mm.getHm().get(a);
			a2.put(i,sTemp);
			IntSum = IntSum * sTemp.length();//计算排列的总数
		}
		
		for(int i=0;i<IntSum;i++)//根据Num数组输出组合数
		{
			for(int j=0;j<a2.size();j++)
			{
				str2 = a2.get(j);
				System.out.print(str2.charAt(Num[j]));
				
			}
			System.out.print(",");
			if(i%10==0)
			{
				sop("");
			}
			
			//sop(a2.size());
			//sop(a2.get(7));
			for(int x=a2.size();x>0;x--)//改变Num数组数,关键就在这里了
			{
				
				str3 = a2.get(x-1);
				
				int Len = str3.length();
				
				if(x<a2.size())
				{
					if(flag[x])
					{
						if(Num[x-1]==Len-1)
						{
							Num[x-1]=0;
							flag[x-1]=true;
							flag[x] = false;
						}
						else
						{
							Num[x-1]++;	
							flag[x] = false;
						}
					}
				}
				else
				{
					if(Num[x-1]==Len-1)
					{
						Num[x-1]=0;
						flag[x-1]=true;
					}
					else
					{
						Num[x-1]++;
						flag[x-1]=false;
					}
				}
			}
		}
		sop("");
		sop("总计排列数:"+IntSum+"\n");//输出总计有多少种
		return 1;
	}
	public static void sop(Object obj)//输出函数
	{
		System.out.println(obj);
	}
}






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值