2011-08-13 59 views
4

我在解決這個問題的時候遇到了麻煩,這個問題不涉及到循環。基本上,如果某件事比某些任意數量大,它會循環。假設64是數字。可能沒有循環做到這一點?

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

et cetera。

我現在正在做這件事的方式涉及一個while循環,檢查值是否超過64,如果是,從中減去64。有沒有另外一種方法可以做到不涉及循環?

我正在使用C#WinForms。

+0

如果你可以在遞歸方法可能被證明是更實用,找到合適的案例。你有沒有考慮遞歸? – Hyperbole

+0

我明白第1,2,3,4,5和6行。然而根據你的描述,196應該產生196 -64-64-64 = 4.你在問題中缺少什麼? – Oli

+0

Woops錯字。感謝您的支持。 –

回答

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

將值修改爲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)。如果你使用三元運算符,爲什麼不先使用它?你只是混合多個概念,使其更難閱讀。 –

相關問題