#include<iostream> #define TelLength 3 using namespace std; //将各个数字多能代表的字符存储在一个二维数组中 char c[10][10]= { "", //0 "", //1 "ABC", //2 "DEF", //3 "GHI", //4 "JKL", //5 "MNO", //6 "PQRS", //7 "TUV", //8 "WXYZ" //9 }; //将各个数字所能代表的字符总数记录于另一个数组中 int total[10]={0,0,3,3,3,3,3,4,3,4}; //用一个数组存储电话号码 int number[TelLength];//TelLength为电话号码的位数 //将数组目前能代表的字符在其所能代表的字符集中的位置用一个数组存储起来 int answer[TelLength];//初始化answer[i]=0 /*举个例子,若number[0]=4,即电话号码的第一位为4,若answer[0]=2,即4目前所代表的字符为 c[number[0]][answer[0]]=c[4][2]='I'*/ //method1直接循环法 //假设电话号码只有3位,那么很快会写出3个for循环来 void directCycle() { for(answer[0]=0;answer[0]<total[number[0]];answer[0]++) for(answer[1]=0;answer[1]<total[number[1]];answer[1]++) for(answer[2]=0;answer[2]<total[number[2]];answer[2]++) { for(int i=0;i<3;i++)cout<<c[number[i]][answer[i]]; cout<<endl; } } /* 的确,针对3位的电话号码,此3个for循环可以很好地解决问题,但是不同地区的电话号码位数不同,而且若是电话号码位数升级 了呢?那我们就必须要修改源代码去增加若干个for循环,这是一件很痛苦的事情,而且也体现不出编程之“美”来,一下对程序 做下简单修改,即可解决这样的可扩展问题 */ //method2 void directSearch() { while(true) { for(int i=0;i<TelLength;i++)cout<<c[number[i]][answer[i]]; cout<<endl; int k=TelLength-1; while(k>=0) { if(answer[k]<total[number[k]]-1) { answer[k]++; break; } else { answer[k]=0; k--; } } if(k<0)break; } } //method3 /* index说明对电话号码的第几位进行循环 */ void RecursiveSearch(int index) { if(index==TelLength) //递归出口,当index为TelLength时,打印本次的TelLength次号码 { for(int i=0;i<TelLength;i++) { cout<<c[number[i]][answer[i]]; } cout<<endl; return ; } for(answer[index]=0;answer[index]<total[number[index]];answer[index]++) { RecursiveSearch(index+1); } } void init() { for(int i=0;i<TelLength;i++)answer[i]=0; for(int i=0;i<TelLength;i++)cin>>number[i]; } int main() { init(); directCycle(); directSearch(); RecursiveSearch(0); system("pause"); return 0; }