编程之美3.2 一堆数组刚开始把我弄晕了,其实还是看代码看的不够多造成的 #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() { threeNumber(); int n = 4; isChangedNumber(n); anotherNumber(0, n); system("pause"); return 0; } /* 方案一 */ void threeNumber() { 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 ii = 0; ii<3; ii++) printf("%c", c[number[ii]][answer[ii]]); printf("/n"); } } /* 方案二 */ void isChangedNumber(int n) { while(true){ for(int i=0; i<n; i++) printf("%c", c[number[i]][answer[i]]); printf("/n"); int index = n-1; 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) { if(index == n) { for(int 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); } }