来求电话号码的字母组合

看道一到比较有意思的一题,主要是通过输入的数字返回特定的字符串,大家看一下怎么做更好

img

递归遍历是比较简单的方法,数字长度有限制吗,长度大的话递归的效率比较低。

img

参考如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
const char g_ys[][5] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
char g_out[1000][20] = { 0 };
int g_i = 0, g_j = 0;
void fun(char* p)
{
    int i, len;
    int x = p[0] - '0';
    if (p[0] == '\0')
    {
        g_out[g_i][g_j++] = '\0';
        g_i++;
        g_j--;
        return;
    }
    len = strlen(g_ys[x]);
    for (i = 0; i < len; i++)
    {
        g_out[g_i][g_j++] = g_ys[x][i];
        fun(p + 1);
        g_j--;
    }
}

int main()
{
    char str[20] = { 0 };
    int i, j, len;
    printf("digits = ");
    gets_s(str);
    len = strlen(str);
    if (len == 0)
    {
        printf("");
        return 0;
    }
    fun(str);
    //填充矩阵
    for (i = 0; i < g_i; i++)
    {
        for (j = 0; j < len; j++)
        {
            if (g_out[i][j] == '\0')
            {
                g_out[i][j] = g_out[i - 1][j];
            }
            printf("%c", g_out[i][j]);
        }
        printf("\n");
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632