在Java中查找同时包含三角形数字和星号的数字

时间:2012-12-03 21:47:29

标签: java methods while-loop

这是我被分配的问题:

  

所谓的“星号”s是由公式定义的数字:   s = 6n(n-1)+ 1   其中n是星号的索引。       因此,前六个(即n = 1,2,3,4,5和6)星号是:1,13,37,    73,121,181

     

相反,所谓的“三角形数”t是从1到n的数字之和:t = 1 + 2 + ... +(n-1)+ n。   因此,前六个(即n = 1,2,3,4,5和6)三角形数字为:1,3,6,10,15,21

     

编写一个Java应用程序,该应用程序生成所有int类型值的列表,这些值都是星号和三角形数。

     

解决此问题时,您必须编写并使用至少一个函数(例如isTriangeNumber()isStarNumber()   或determineTriangeNumber()determineStarNumber())。此外,您必须只使用此处提供的公式来解决问题。

tl; dr:需要输出同时包含星号和三角数的值。

不幸的是,我只能得到结果在无限循环中输出值'1',即使我在while循环中递增1。

public class TriangularStars {
    public static void main(String[] args) {

    int n=1;            
    int starNumber = starNumber(n);
    int triangleNumber = triangleNumber(n);

    while ((starNumber<Integer.MAX_VALUE)&&(n<=Integer.MAX_VALUE))
    {
        if ((starNumber==triangleNumber)&& (starNumber<Integer.MAX_VALUE))
                {
                    System.out.println(starNumber);
                }
        n++;
    }
  }


public static int starNumber( int n)
{
    int starNumber;
    starNumber= (((6*n)*(n-1))+1);
    return starNumber;

}
public static int triangleNumber( int n)
{
    int triangleNumber;
    triangleNumber =+ n;
    return triangleNumber;
}

}

5 个答案:

答案 0 :(得分:6)

这是一个骨架。自己完成剩下的工作:

问自己的问题:

  1. 如何制作三角形数字?
  2. 我如何知道某些内容是否为星号?
  3. 为什么我只需要继续直到三角形为负?三角形怎么会变成消极的?
  4. 祝你好运!

    public class TriangularStars {
      private static final double ERROR = 1e-7;
    
      public static void main(String args[]) {
        int triangle = 0;
        for (int i = 0; triangle >= 0; i++) {
          triangle = determineTriangleNumber(i, triangle);
          if (isStarNumber(triangle)) {
            System.out.println(triangle);
          }
        }
      }
    
      public static boolean isStarNumber(int possibleStar) {
        double test = (possibleStar - 1) / 6.;
        int reduce = (int) (test + ERROR);
        if (Math.abs(test - reduce) > ERROR)
          return false;
    
        int sqrt = (int) (Math.sqrt(reduce) + ERROR);
        return reduce == sqrt * (sqrt + 1);
      }
    
      public static int determineTriangleNumber(int i, int previous) {
        return previous + i;
      }
    }
    

    输出:

    1
    253
    49141
    9533161
    1849384153
    

答案 1 :(得分:3)

您需要在循环内添加对starNumber()triangleNumber()的新调用。您获得了初始值,但从未使用更新的n值重新调用它们。

作为第一个剪辑,我会立即将这些调用放在n ++之后,所以

n++;
starNumber = starNumber(n);
triangleNumber = triangleNumber(n);
  }
}

答案 2 :(得分:3)

这里的问题是“N”对于星形和三角形数字都不一定相同。因此,在计算星形和三角形数字时可以增加“n”,而不是增加三角形数,只要它减去当前的星数。基本上你需要保持两个变量“n”和“m”。

答案 3 :(得分:1)

第一个问题是你只能在循环外调用starNumber()方法一次。 (与triangleNumber()相同。)

第二个问题是除非Integer.MAX_VALUE是星号,否则你的循环将永远运行。原因是Java数值操作无声地溢出,所以如果你的下一个星号大于Integer.MAX_VALUE,结果就会好转。您需要使用long来检测数字是否大于Integer.MAX_VALUE

第三个问题是,即使您将所有调用放入循环,它也只会显示共享相同n值的星号/三角数对。你需要有两个并行的索引,一个用于星号,另一个用于三角数,并且根据哪个函数返回较小的数字而递增一个或另一个。所以有这样的话:

while( starNumber and triangleNumber are both less than or equal to Integer.MAX_VALUE) {
   while( starNumber < triangleNumber ) {
     generate next starnumber;         
   }
   while( triangleNumber < starNumber ) {
     generate next triangle number;
   }
   if( starNumber == triangleNumber ) {
     we've found a matching pair
   }
}

第四个问题是你的triangleNumber()方法错了,我想知道它是如何编译的。

答案 4 :(得分:0)

我认为你的方法存在缺陷。如果没有,在该方法中,您将无法直接制作isStarNumber(n)的方法来测试每个可能的星号。我会采取稍微不同的方法:预先计算。

首先,找到所有三角形数字:

List<Integer> tris = new ArrayList<Integer>();
for(int i = 2, t = 1; t > 0; i++) { // loop ends after integer overflow
    tris.add(t);
    t += i; // compute the next triangle value
}

我们可以为星号做同样的事情:

考虑以下内容 -

star(n) = 6*n*(n-1) + 1 = 6n^2 - 6n + 1

therefore, by extension

star(n + 1) = 6*(n+1)*n + 1 = 6n^2 + 6n +1

and, star(n + 1) - star(n - 1), with some algebra, is 12n

star(n+1) = star(n) + 12* n

这使我们得到以下公式

List<Integer> stars = new ArrayList<Integer>();
for(int i = 1, s = 1; s > 0; i++) {
    stars.add(s);
    s += (12 * i);
}

真正的问题是......我们真的需要搜索每个号码吗?答案是不!我们只需要搜索实际上是其中一个的数字。所以我们可以轻松地使用星星中的数字(其中18k)并找到那些也是星星的数字!

for(Integer star : stars) {
    if(tris.contains(star)) 
        System.out.println("Awesome! " + star + " is both star and tri!");
}

我希望这对你有意义。为了您自己,请不要盲目地将这些片段移动到您的代码中。相反,要了解它为什么会这样做,在你不确定的地方提出问题。 (希望这不会在两个小时内到期!)

祝你好运。

这里有一些很棒的东西会返回前4个而不是最后一个。我不知道为什么最后不会出来。玩得开心:

class StarAndTri2 {
    public static void main(String...args) {
        final double q2 = Math.sqrt(2);
        out(1);
        int a = 1;
        for(int i = 1; a > 0; i++) {
            a += (12 * i);
            if(x((int)(Math.sqrt(a)*q2))==a)out(a);
        }
    }
    static int x(int q) { return (q*(q+1))/2; }
    static void out(int i) {System.out.println("found: " + i);}
}