电话号码盘一般可以用于输入字母,如2可以输入A、B、C,等等。要求设计号码所对应的所有组合。如5969872可以对应:JTMWTPA、JTMWTPB等。
这就相当于排列数,如5对应J、K、L,以J、K、L各自引出9对应的W、X、Y、Z这些数字的组合就构成一棵树。
我们可以构建一个二维数组charc[10][10]={“”,“”,“ABC”···}并将各个数字所能代表的字符总数记录在另一个数组inttotal[10]={0,0,3,3···4};用一个数组存储电话号码位数int number[TelLength];将数字目前所代表的字符在其所能代表的字符集中的位置用一个数组存储起来:int answer[TelLength],初始化为0;这个关键,遍历中的核心。如answer[0]对应数字5,它如果是K,则answer[0]的值是1。最简单的方法就是有多少个数字就套多少层循环。这样代码总是都得修改,还可以以每次从answer[n-1]开始访问,让answer[n-1]++,如果answer[n-1]超过它对应字母个数时,将其至0,并让answer[n-2]++。以此类推,也可遍历所有的可能值。或者用递归。
具体代码如下:
while(true){
//n为电话号码长度
for(i =0;i<n;i++){
printf(“%c”,c[number[i]][answer[i]]);
}
printf(“\n”);
int k = n-1;
while(k>=0){
if(answer[k]<total[number[k]-1]){
answer[k]++;
break;
}else{
answer[k]= 0;k--;
}
}
if(k<0)break;
}