写一个函数unsigned int pose(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)。 •您不能使用全局变量。 •您不能使用库函数。
答案 0 :(得分: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;
}
解析此代码将揭示一些事情: -
我只是在每一步中都做了必要的步骤。在循环解决方案中,基本上提取数字。在这里我也这样做。然后通过另一次调用pose
来解决缩减的子问题。
如果您考虑标准解决方案,您将看到以相反顺序提取的数字。你不希望这样。您应该使用递归来保存结果并使用它进行必要的最终操作,而不是使用另一个额外的变量。反复使用此base*pose(val/base,base)+(val%base);
进行。
正如保罗所讨论的那样,如果我们将其解释为“在转换后的基数b中打印数字”,那么这个问题就更合乎逻辑了。
解决方案将类似于: - 下面显示的代码是保罗的想法。以前的代码是我的。
void pose (unsigned int val, unsigned int base){
if(val) {
pose(val/base,base);
printf("%c", (val%base)+'0');
}
}
答案 1 :(得分:1)
Coderredoc的答案显示了使用递归的一个很好的解决方案。然而,对这个问题唯一明智的解释是在基数中打印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