2017-06-18 16 views
-2

这个练习要求我们编写一个计算贫困孩子可以得到的糖果数量的程序。问题如下:为什么我不能使用这个程序得到正确数量的糖果?

你被要求写一个Java程序来帮助这些可怜的孩子回答这个问题。为了推广该解决方案,您的程序应该能够接受n和m的不同值作为输入,其中n = 10,m = 2。为了避免无限数量的答案,你可以假设每个糖果都有一个箔片,并且不允许切割箔片。

我遵循给出的提示使用提供的公式和java递归编写程序。

import java.util.Scanner; 

public class MyFirstClass{ 
    public static void main(String args[]){ 
     Scanner a=new Scanner(System.in); 
     int n=0,m=0; 
     n = a.nextInt(); 
     m = a.nextInt(); 
     System.out.println("Candy " +n+" "+ m + " n="+ n+";m="+m+";No. of Candies="+total(n,m)); 
    } 
    static int sum=0; 
    static int total(int n, int m) 
    { 
     int sum1=n; 
     sum1+=candy(n,m); 
     return sum1; 
    } 
    static int candy(int n,int m){ 
     if((n+n%m)/m>1){ 
      sum+=n/m+candy((n+(n%m))/m,m); 
     } 
     return sum; 
    } 
} 

然而,当我集合n = 10且m = 2,糖果的计算的总数量小于由1实际总数糖果的什么是我的节目的问题?谢谢!

+0

这是一个好时机,开始学习如何使用调试器。 – OldProgrammer

+0

你能帮助我们理解你的公式吗?请解释他们。到底发生了什么?否则,我们需要一些时间来进入它,许多人不愿意这样做。 – Zabuza

+0

欢迎来到Stack Overflow!它看起来像你需要学习使用调试器。请帮助一些[互补调试技术](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之后仍然遇到问题,请随时返回一个[最小,完整且可验证的示例](http://stackoverflow.com/help/mcve),以说明您的问题。 –

回答

1

对于你的糖果功能:

static int candy(int n,int m){ 
    if((n+n%m)/m>1){ 
     sum+=n/m+candy((n+(n%m))/m,m); 
    } 
    return sum; 
} 

它是如何即使编译时sum是不确定的?

在任何情况下,candy函数都需要检查第一个参数为0或1时的边界条件。并且我将假设负数也是无效的输入。

int candy(int n, int m) { 
    if ((n <= 1) || (m == 0)) { 
     return 0; 
    } 
    return n/m + candy(((n+n%m)/m), m); 
} 

而且由于它的“尾递归”,可以实现while循环整个事情:

int candy(int n, int m) { 

    int result = 0; 

    while ((n > 1) && (m != 0)) 
    { 
     result += n/m; 
     n = (n+n%m)/m; 
    } 

    return result; 
} 
相关问题