9

基数から始まる数値の最初の倍数を見つける必要があります。例: 7 からの 3 の最初の倍数は 9 です。私の最初の試みはこれを行うことでした:

multiple = baseNumber
while(multiple%number !=0 )
    multiple++

最後に、「multiple」はnumberafterの最初の倍数になりbaseNumberます。問題は、number大きくなりすぎると反復回数が多くなりすぎることです。私の質問は次のとおりです。これを行うためのより速い方法はありますか?

4

4 に答える 4

24

すべてが正であることが保証されている場合は、試してください

multiple = baseNumber + number - 1;
multiple -= (multiple % number);

それは一定の時間でそれを行います。

number - 1最初に、少なくとも次の倍数と同じ大きさで、その次の倍数よりも小さい数があることを確認するために加算します。number次に、目的の倍数になるように、除算の残りを減算します。

ifbaseNumberが負になる可能性がある (それでも正である) 場合、 if が負になる可能性があるnumberという問題に直面するため、上記は の倍数をスキップする可能性があります。それを避けるために、例えば使用することができますmultiple % numbermultiple < 0number

remainder = multiple % number;
if (remainder < 0) remainder += number;
multiple -= remainder;

分岐が高すぎる場合はif、1 つではなく 2 つの分割を犠牲にして回避できます。

multiple -= (number + (multiple % number)) % number;

ただし、一般的には、ifが好ましいようです。

負になる可能性がある場合numberは、最初にその絶対値に置き換えます。

注: 上記は、元のコードと同様に、baseNumberそれが既に の倍数である場合に戻りますnumber- 1それが望ましくない場合は、最初の行の を削除します。

于 2012-07-27T17:43:26.563 に答える
4

これを試してください(INTEGER除算が必要です):

multiple = ((base/number) + 1) * number;

7/3 = 2. 3*(2+1) = 9.

baseNumberが既に の倍数であるエッジ ケースがありnumber、モジュラス演算を使用してテストする必要があります。

于 2012-07-27T17:45:14.317 に答える
3

なぜループが必要なのですか?

倍数 = (階数/基数)+1)*基数

于 2012-07-27T18:09:21.640 に答える
0
 while(multiple * number < baseNumber)
      multiple++;

したがって、baseNumber = 3、number = 7 の場合、倍数は 3 です。

しかし、ビッグナムがここに現れようとしていることを何かが教えてくれます。

于 2012-07-27T17:44:37.233 に答える