2012-07-27 14 views
8

基本番号から始まる番号の最初の倍数を見つける必要があります。 7から3の第1の多重9.私の最初の試みは、これを行うにしている:例えば終わり素早く番号の次の倍数を見つける

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

を、「複数の」baseNumbernumberの最初の倍数になります。問題は、numberが大きくなり過ぎると、反復回数が多くなりすぎるということです。だから私の質問です:これを行うより速い方法がありますか?

+1

あなたは数学スタック所でこれを求めたほうが良いかもしれません。数字の倍数で何を意味するのかを、より明確またはより厳密に定義したい場合もあります。 – Jim

答えて

19

すべてがポジティブであることが保証されている場合は、一定の時間でそれをしない

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

を試してみてください。

最初に、number - 1を追加して、少なくとも次の倍数と同じ大きさで、それよりも小さい数値を確保します。次に、除算の残りをnumberで減算して、希望の倍数を確保します。 (まだしかしnumber正)

baseNumberを否定することができた場合は、我々は、上記のnumberの複数をスキップすることができmultiple % numberように、multiple < 0場合は負でもよいという問題に直面しています。それを避けるために、たとえば分岐があまりにも高価である場合は、我々は1つではなく、2つの区分のコストでifを避けることができ

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

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

は一般的に、 ifは、しかし、望ましいと思われます。

numberの値が負の値になる場合は、最初にその絶対値に置き換えてください。

注:上記は、元のコードのように、baseNumberが既にnumberの倍数である場合は返します。それが望ましくない場合は、最初の行にある- 1を削除してください。

+0

'baseNumber'よりも大きい次の倍数が必要であると仮定して、これは正しいとは思いません。 'baseNumber = 6、number = 3'を考えてみましょう。より一般的には、 'number'が' baseNumber'を分割するときはいつでも失敗すると思います。 – DSM

+0

私はすでに 'multiple 'であれば' baseNumber'を返すOPのコードを使いました。しかし、私はこれに関するノートを追加します、ありがとう。 –

+0

@ DSMそうなら、あなたは "-1"を削除しなければなりません。 –

0
while(multiple * number < baseNumber) 
     multiple++; 

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

しかし、何かビギナムがここに現れそうです。

+1

私はこれがOPが持っていたものと同じ問題に遭遇したように感じます。 'number'は2のようなもので、baseNumberは10億であるとします。 2の倍数をすべて10億までチェックする必要はありません。その場合は –

+0

これは数学的な質問の多くです...私はそこに数式があることを知っています。私の推測している私の古い暗号ノートを見てください.... – Shark

4

はこれを試す(整数の除算が必要):

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

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

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

+0

Doh。私はあなたの答えをかなり繰り返しました。しかし、ベース/数字の後ろにフロア機能が必要なのですか? – bigbenbt

+1

整数部:D –

+0

Ah。あなたの言葉を太字で表示する理由があります。 – bigbenbt

3

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

複数=(床(数/ baseNumber)+1)* baseNumber

関連する問題