2011-08-13 8 views
4

私はループを伴わないこの問題に対する解決策を考えるのに苦労しています。基本的には、何かが任意の数よりも大きい場合、ループします。 64がその数であるとしよう。ループなしでこれを行うことは可能ですか?

0 => 0 
32 => 32 
64 => 64 
96 => 32 
128 => 64 
160 => 32 
192 => 64 

等が挙げられる。

私が現在やっているやり方は、値が64以上であるかどうかを確認するwhileループと、それから64を引くことです。ループを伴わない別の方法がありますか?

私はC#WinFormsを使用しています。

+0

で割り切れの場合に役立つことはありません適切なケースを見つける。再帰を考えましたか? – Hyperbole

+0

私は1,2,3,4,5,6行目を理解していますが、あなたの説明によれば、196は196 -64-64-64 = 4となります。あなたの質問には何が欠けていますか? – Oli

+0

Woops typo。それをキャッチするためにありがとう。 –

答えて

5
public static int filterNumber(int x, int arbitraryNumber) { 
    if (x < arbitraryNumber) { 
    return x; 
    } 

    int result = x % arbitraryNumber; 
    if (result == 0) { 
    return arbitraryNumber; 
    } 

    return result; 
} 
+0

これは完全に機能します。 upvotedと受け入れられる! –

6

Mod値を64に設定すると、O(1)操作になります。このように:

int number; 
// number is initialized 
number %= 64; 
+0

これが最適なアプローチです。 –

+0

Doh。私はモジュラス演算子を使っていました。私はいくつかの睡眠が必要だと思う..ヘビー。ありがとう。 –

+0

私はそれがO(1)だとは思わないでしょう。複雑度クラス(Big-O表記法)はチューリングマシンを使用して定義されており、チューリングマシンでO(n)操作を実行する必要があります。積分除算を使用せずに演算のためのメソッドを書くようにしてください。 –

-1
return n  == 0 ? 0 : 
     n % 64 == 0 ? 64 : 
     n % 32 == 0 ? 32 : 
        -1; // you have not specified this case in your examples! 
+1

はい、私は@Dinahの答えに言及したように、modだけでは64の倍数の答えはカバーされません(0を返し、例のように64を返しません) – Oli

+0

編集された答えが十分にエレガントであることを願っています。 –

+0

@Gabriel:x == 0の場合、あなたの値は0になりません。 – Dinah

1

だけで剰余が可能な場合は、再帰的なアプローチは、より有用であることを証明するかもしれない64

if (number == 0) 
    return 0; 
var mod = number % 64; 
return (mod == 0) ? 64 : mod; 
+1

これは、X%64が0のモジュロをもたらす場合に対処しません(128を見て、64を返します) – Oli

+0

あなたは今良いです...答えを更新しましたか? – Oli

+0

変数に名前を付ける場合は、適切な名前を選択します。mod(ulus)は操作の名前で、結果はrem(ainder)と呼ばれます。三項演算子を使用する場合は、最初にそれを使用しないでください。複数のコンセプトを混ぜ合わせるだけで、読みにくくなります。 –

関連する問題