C,十进制到其他没有循环的基本系统

时间:2017-11-11 13:49:42

标签: c number-systems

写一个函数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)。 •您不能使用全局变量。 •您不能使用库函数。

2 个答案:

答案 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;
}

解析此代码将揭示一些事情: -

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

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

  3. 正如保罗所讨论的那样,如果我们将其解释为“在转换后的基数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