电话号码对应英文单词

#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;
}	


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值