0

私は非常に基本的なAndroidアプリに取り組んでおり、ループトラバーサルに対応してプログレスバーを更新して、入力された数値が素数であるかどうかを確認する必要があります。入力する番号は、長いデータ型である必要があります。計画は、i = 2からsqrt(number)までのループをトラバースし、入力された数値を反復ごとにiで除算することでした。私が数を割ると、ループは終了し、素数ではないと判断します。

それ以外の場合は、進行状況を更新しながら、ループが続行されます。関連するコードのスニペットは次のとおりです。

protected Void doInBackground(Long... params) {
String message;
Intent intent = new Intent(MainActivity.this, DisplayMessageActivity.class);

long lim = (long)Math.sqrt(params[0]);

for (int i = 2; i <= lim; i++) {
        if (params[0] % i == 0) {
    message = params[0] + " is not prime!";
    int myProgressFinal = 100;
        publishProgress(myProgressFinal);
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
    return null;
        }
        else {              
            int myProgress = i/lim * 100;
            publishProgress(myProgress);

            if (isCancelled())
                return null;
        }
    }

message = params[0] + " is prime!";
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
return null;
}

}

私の問題点はelseステートメントです:

else {              
    int myProgress = i/lim * 100;
    publishProgress(myProgress);

ループの整数iがあり、ループの進行状況を示しています。進行したパーセンテージを見つけるには、ループの最大量(lim = sqrt(number))で除算してから、乗算する必要があります。適切なパーセンテージを取得するには、100ずつ。ただし、これを行うことはできません。myProgressは整数ですが、limは長く、intに変更できません。limをintにしたとしても、整数除算で間違った値(0 * 100)が返されます。それらの1つを型キャストしてb/cを2倍にすることはできません。publishProgress()を通過するには、myProgressをintにする必要があります。助言がありますか?

4

1 に答える 1

1

まず、「i」が lim までの範囲にある場合、「i」も long である必要があります。そうしないと、'i' が Integer.MAX_VALUE に達すると、次の反復でオーバーフローが発生します。

i を long として宣言したいと思いますが、else ステートメントで宣言します。

"int myProgress = (int)((((double)i)/lim) * 100)"

于 2013-01-29T04:39:16.377 に答える