/*第二题
* 从图中,我们可以发现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);
}
}