如何递归解码给定整数的单词?

时间:2017-01-17 22:50:02

标签: c recursion encoding decoding

每个字母都分配一个与其在字母表中的位置相对应的数字。 '一个'是0,' b'是1,' c'是2等。

所有字母均为小写

一个字母的单词编码就是它的编号。

如果一个单词的前n-1个字母的编码是x,并且第n个字母的编码是m,那么n个字母单词的编码是x * 26 + m。

我明白逻辑是这样的:

如果单词只包含一个字母,则编码介于0到25之间。

如果单词包含两个字母,请参阅第一个字母* 26 + secondletter

如果单词包含三个字母,则(firstletter * 26 + secondletter)* 26 + thirdletter

等等,直到你编码完整的东西。

我不知道如何通过基本案例。请帮忙!

这是我到目前为止所做的:

char print_letter(unsigned int number)
{
    char c = number + 97;
    if (number <= 25)
    {
        printf("%c\n", c);
        return(c);
    }
    else
    {
        fprintf(stderr, "ERROR: print_letter: Received "
            "input %d,", number);
        fprintf(stderr, " between 0 and 25 expected.");
        return('-');
    }
}

void print_word(unsigned int number)
{
    if(number <= 25)
        print_letter(number);
    else
    {
        print_letter((number / 26) % 26);
        print_word(number / 26);
    }
}

1 个答案:

答案 0 :(得分:0)

你有公式

number = x*26+m

现在你有了数字,想要计算x和m。如何去做?

m = number % 26
x = (number - m) / 26

所以你的代码必须如下所示:

void print_word(unsigned int number)
{
    if(number <= 25)
        print_letter(number);
    else
    {
        int m = number % 26;
        int x = (number - m) / 26;

        print_word(x);
        print_letter(m);
    }
}

请注意,您必须在print_letter之前调用print_word,以使输出中的字母顺序正确。