关于组合数的小程序

来源:互联网 发布:关系数据库设计理论 编辑:程序博客网 时间:2024/05/17 08:35


/*第二题* 从图中,我们可以发现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{//如果不是则返回0sop("输入数据不合法输入数据必须为大于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);}}