现在的位置: 首页 > 综合 > 正文

编程之美 3.2 电话号码对应英语单词

2018年01月19日 ⁄ 综合 ⁄ 共 1066字 ⁄ 字号 评论关闭

题目描述

电话的号码盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。
对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTB······
     1) 设计程序,尽可能从这些字母组合中,找到一个有意义的单词来表述一个电话号码。如单词"computer"来描述号码26678837。
     2) 对于一个号码,是否可以用一个单词代表?怎样才是最快的方法?

解法一:直接循环法 
解法二:递归法 

#include<iostream>
#include<stdio.h>
using namespace std;

int number[100];
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 answer[10];//电话号码 

void compute(int length)
{
	int k;
	while(true)
	{
		k=length-1;
		for(int i=0;i<length;i++)
			cout<<c[number[i]][answer[i]]<<" ";//输出每个号码的第一个字符, 
		cout<<endl;
		
		while(k>=0)
		{
			if(answer[k]<total[number[k]]-1)
			{
				answer[k]++;
				break;
			}
			else
			{
				answer[k]=0;
				k--;
			}
		}
		if(k<0)
			break;
	}
}

void recursion(int length,int index)
{
	if(index==length)
	{
		for(int i=0;i<length;i++)
			cout<<c[number[i]][answer[i]]<<" ";
		cout<<endl;
		return ;
	}
	for(answer[index]=0;answer[index]<total[number[index]];answer[index]++)
		recursion(length,index+1);
}

int main() {
	int length=3;
	number[0]=2;
	number[1]=3;
	number[2]=4;
	printf("method 1:\n"); 
	compute(length);
	printf("method 2:\n");
	recursion(length,0);
	return 0;
}

抱歉!评论已关闭.