-5

编写一个函数 unsigned intpose (unsigned int val, unsigned int base),它为每个给定值 val 返回一个以十进制表示法给出的值 val。

系统中 val 的值可以用基数来解释。您可以假设 base 始终介于 2 和 9 之间,并且 val 足够小以在目标系统上导致任何数字范围违规。例子:

• pose (3,2) = 11 // 310 = 1 · 2 + 1 · 1 = 12
• pose (5,5) = 10 // 510 = 1 · 5 + 0 · 1 = 105
• pose (19,5) = 34 // 1910 = 3 · 5 + 4 · 1 = 345
• pose (5,6) = 5 // 510 = 5 · 1 = 56
• pose (7,7) = 10 // 710 = 1 · 7 + 0 · 1 = 107
• pose (543,9) = 663 // 54310 = 6 · 9

2 + 6 · 9 + 3 · 1 = 6639 请注意以下规则: • 您的输出存档应该只包含一个名为“convert.c”的文件。该文件定义了函数pose()以及可能由pose()函数进行的其他调用。不要指定 main() 函数,不要包含 makefile。• 不得使用循环(关键字for、while、goto)。• 不得使用全局变量。• 您不能使用库函数。

4

2 回答 2

1

关于如何解决它的前几个提示或方法:-

  • 只是先解决问题。
  • 使用循环和局部变量以及任何需要的东西。
  • 一旦你解决了它。然后寻找应用约束。

这很容易表明您必须使用递归。现在休息很容易——只需决定你将在一个循环中做什么。并将其转移到另一个具有适当参数的递归调用。

 unsigned int pose (unsigned int val, unsigned int base){
    unsigned int ret = 0;
    if(val)
        ret=base*pose(val/base,base)+(val%base);
    return ret;
}

剖析这段代码将揭示一些事情:-

  1. 我只是在每个步骤中做必要的步骤。在循环解决方案中,基本上提取了一个数字。在这里我也这样做。然后通过另一个调用来解决减少的子问题pose

  2. 如果您考虑标准解决方案,您将看到以相反的顺序提取数字。你不想要那个。而不是使用另一个额外的变量,您应该只使用递归来保存结果并对其进行必要的最终操作。反向是base*pose(val/base,base)+(val%base);专门使用这个来完成的。

正如与保罗所讨论的那样,如果我们将其解释为简单地“以转换后的基数 b 打印数字”,那么这个问题就更合乎逻辑了。

解决方案将与此类似:-下面显示的代码是 Paul 的想法。以前的代码是我的。

void pose (unsigned int val, unsigned int base){
    if(val) {
        pose(val/base,base);
        printf("%c", (val%base)+'0'); 
    }
}
于 2017-11-11T14:02:24.110 回答
1

Coderredoc 的答案显示了使用递归的一个很好的解决方案。但是,对该问题的唯一合理解释是在 base 中打印 val:

 void pose (unsigned int val, unsigned int base){
    if(val) {
        pose(val/base,base);
        printf("%c", (val%base)+'0');
    }
}


int main(void)
{
    pose (8,8);  printf("\n");
    pose (8,2);  printf("\n");
    pose (19,5); printf("\n");
    return 0;
}

输出:

10
1000
34
于 2017-11-11T14:31:53.477 回答