2

这是我被分配的问题:

所谓的“星号”,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()orisStarNumber()determineTriangeNumber()or 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;
}

}

4

5 回答 5

6

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

要问自己的问题:

  1. 如何制作三角号码?
  2. 我怎么知道某物是否是星号?
  3. 为什么我只需要继续直到三角形为负数?三角形怎么可能是负数?

祝你好运!

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
于 2012-12-03T22:01:28.207 回答
3

这里的问题是星号和三角形数的“N”不必相同。所以你可以在计算星数和三角形数时增加“n”,而不是继续增加三角形数,只要它小于当前的星数。本质上,您需要维护两个变量“n”和“m”。

于 2012-12-03T21:53:11.393 回答
3

您需要在循环内和循环内添加新starNumber()调用triangleNumber()。您获得初始值,但永远不会使用更新的值重新调用它们n

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

n++;
starNumber = starNumber(n);
triangleNumber = triangleNumber(n);
  }
}
于 2012-12-03T21:50:26.113 回答
1

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

第二个问题是,除非Integer.MAX_VALUE是星号,否则您的循环将永远运行。原因是 Java 数值运算会无声地溢出,因此如果您的下一个星号大于Integer.MAX_VALUE,结果将只是环绕。您需要使用longs 来检测数字是否大于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()方法是错误的,我想知道它是如何编译的。

于 2012-12-03T21:49:28.507 回答
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)并找到那些也是 tris 的数字!

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);}
}
于 2012-12-03T22:17:25.920 回答