这是我被分配的问题:
所谓的“星号”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;
}
}
答案 0 :(得分:6)
这是一个骨架。自己完成剩下的工作:
问自己的问题:
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);}
}