#include <stdio.h>
#include <stdlib.h>
#define TelLength 11
char c[10][5] = {
"", //0
"", //1
"ABC", //2
"DEF", //3
"GHI", //4
"JKL", //5
"MNO", //6
"PQRS", //7
"TUV", //8
"WXYZ", //9
};
//如果number[0] = 4, answer[0] = 2
//c[number[0]][answer[0]] = c[4][2] = 'I';
int total[10] = {0,0,3,3,3,3,3,4,3,4};
int number[TelLength] = {3,5,4,6,7,9};
int answer[TelLength] = {0};
void threeNumber();
void isChangedNumber(int n);
void anotherNumber(int index, int n);
int main()
{
int n=4;
threeNumber();
isChangedNumber(n);
anotherNumber(0, n);
system("pause");
return 0;
}
/*
方案一
*/
void threeNumber()
{
int ii;
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( ii = 0; ii<3; ii++)
printf("%c", c[number[ii]][answer[ii]]);
printf("\n");
}
}
/*
方案二
*/
void isChangedNumber(int n)
{
int i;
int index = n-1;
while(1){
for(i=0; i<n; i++)
printf("%c", c[number[i]][answer[i]]);
printf("\n");
while(index >= 0)
{
if(answer[index] < total[number[index]] - 1)
{
answer[index]++;
break;
}
else
{
answer[index] = 0;
index--;
}
}
if(index < 0 )
break;
}
}
/*
该方法可以看做是方法一循环方法的变种,
从循环中被我们批判的n个for循环中得到提示,每层的for循环,其实可以看成一个递归函数的调用
*/
void anotherNumber(int index, int n)
{
int i;
if(index == n)
{
for(i=0; i<n; i++)
printf("%c", c[number[i]][answer[i]]);
printf("\n");
}
for(answer[index] = 0 ; answer[index] < total[number[index]]; answer[index]++ )
{
anotherNumber(index+1, n);
}
}
编程之美--电话号码对应英语单词
以下代码在vc++6.0 通过。网上的代码跟我的代码有一点出入,主要是我的代码符合C99 标准(指c语言的。 由于不允许在for
的内部声明变量,所有变量事先声明,因此我没在for里面定义i.而把变量声明写在前面。