2017-11-11 115 views
-5

写功能unsigned int的姿态(无符号整数VAL,无符号整型基) 返回十进制给出对于每个给定值VAL的值VAL。在系统val的C,十进制到其他基站系统没有循环

值可以用碱碱来解释。可以 假设基地总是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)。 •您不能使用全局变量。 •您不能使用库函数。

+7

那你试试?我应该做你的功课吗? – OznOg

回答

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中的数​​字”,那么问题就更加合理了。

该解决方案将是这样的相似: - 下一个显示的代码是保罗的想法。以前的代码是我的。

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

对于每个给定值val_,返回值为__decimal__表示的值的部分是无意义的(矛盾)。 val或者被转换为“base”或者不被转换。用2和16检查你的自我 –

+0

然后答案将打印十进制数字'0..base-1'(但不是十进制符号)。 –

+0

我刚刚意识到整个问题/解决方案是无意义的,因为您正在转换某些内容,并且在将其分配给'ret'时,它将转换为二进制文件。所以唯一可能的解决方案是在一些基础上打印这个值。考虑二进制,八进制,十进制,十六进制:它们都是相同的位。 –

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 
+0

我upvoted bacuse它也是对的 – coderredoc