2

これは私が割り当てられた質問です:

いわゆる「星の数」sは、次の式で定義される数です。s = 6n(n-1)+ 1ここで、nは星の数のインデックスです。したがって、最初の6つ(つまり、n = 1、2、3、4、5、および6の場合)の星の数は、1、13、37、73、121、181です。

対照的に、いわゆる「三角数」tは、1からnまでの数の合計です。t= 1 + 2 +…+(n-1)+n。したがって、最初の6つ(つまり、n = 1、2、3、4、5、および6の場合)の三角数は、1、3、6、10、15、21です。

六芒星と三角数の両方であるint型のすべての値のリストを生成するJavaアプリケーションを作成します。

この問題を解決するときは、少なくとも1つの関数(isTriangeNumber()orisStarNumber() またはordetermineTriangeNumber()などdetermineStarNumber())を記述して使用する必要があります。また、問題を解決するには、ここで提供されている式のみを使用する必要があります。

tl; dr:スター番号とトライアングル番号の両方の値を出力する必要があります。

残念ながら、whileループで1ずつインクリメントしていても、無限ループで値「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

starNumber()ループ内およびループ内に新しい呼び出しを追加する必要がありtriangleNumber()ます。初期値を取得しますが、更新されたn値でそれらを再度呼び出すことはありません。

最初のカットとして、これらの呼び出しをn++の直後に配置します。

n++;
starNumber = starNumber(n);
triangleNumber = triangleNumber(n);
  }
}
于 2012-12-03T21:50:26.113 に答える
3

ここでの問題は、「N」が星と三角数の両方で同じである必要はないということです。したがって、星数と三角数の両方を計算するときに「n」を増やすことができます。現在の星数が少ない限り、三角数を増やし続けます。基本的に、2つの変数「n」と「m」を維持する必要があります。

于 2012-12-03T21:53:11.393 に答える
1

starNumber()最初の問題は、ループの外側でメソッドを1回だけ呼び出すことです。(そして同じtriangleNumber()です。)

二次的な問題はInteger.MAX_VALUE、がスター番号でない限り、ループが永久に実行されることです。その理由は、Javaの数値演算がサイレントにオーバーフローするため、次の星の数が。よりも大きい場合Integer.MAX_VALUE、結果はラップアラウンドするだけです。longsを使用して、数値が。より大きいかどうかを検出する必要がありますInteger.MAX_VALUE

3番目の問題は、すべての呼び出しをループに入れたとしても、同じn値を共有する星番号と三角数のペアしか表示されないことです。2つのインデックスを並列に配置する必要があります。1つは星数用、もう1つは三角数用で、どちらの関数が小さい方の数を返すかに応じて、どちらか一方をインクリメントします。したがって、これらの線に沿った何か:

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
   }
}

そして4番目の問題はあなたの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)を簡単に使用して、トリスでもある数字を見つけることができます。

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

これがあなたにとって理にかなっていることを願っています。あなた自身のために、これらのスニペットをやみくもにコードに移動しないでください。代わりに、なぜそれが何をするのかを学び、確信が持てないところで質問してください。(うまくいけば、これは2時間以内に期限が切れていません!)

そして、この割り当てで頑張ってください。

これは、最初の4つを返すが、最後の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 に答える