for (int i=n1; i < n2; i++){
if (i % 2 == 0){
System.out.println(i);
}
}
該代碼打印出n1和n2之間的所有數字(它們是隨機生成的),它們都可以被2和3整除,但我只想打印出可以被2整除的數字。這個?打印可被2整除但不是3的數字?
for (int i=n1; i < n2; i++){
if (i % 2 == 0){
System.out.println(i);
}
}
該代碼打印出n1和n2之間的所有數字(它們是隨機生成的),它們都可以被2和3整除,但我只想打印出可以被2整除的數字。這個?打印可被2整除但不是3的數字?
你從字面上一半。
你需要第二個條件中,你強制要求的數量不被3整除這將是這個樣子:
!(i % 3 == 0)
現在,你需要一個布爾操作來只返回,如果真這兩個條件都是真的。那我將作爲練習留給讀者。
(其他人已經給出了正確的答案,但我會盡量多一點自然地解釋)
對於計算機,你需要寫一個句子中,他們能理解的方式。您需要將邏輯句子(如「divise by 2 but not by 3」)轉換爲更基本的版本,僅使用單詞「not」,「and」和「or」。在你的具體情況下,你想說the numbers that are divisible by 2 AND NOT divisible by 3
正如你已經注意到的,N%X!=0
是一個(醜陋)的方式來編寫N is divisible by X
。在Java中,我們使用!
來說not
和&&
來說and
。
這樣,(N is divisible by 2) AND NOT (N is divisible by 3)
可以寫成(N % 2 == 0) && !(N % 3 == 0)
。但是,我們也有X not equal Y
運營商(X!=Y
),這相當於NOT (X equal Y)
,但更容易理解,造成這種代碼:
if ((i % 2 == 0) && (i % 3 != 0)) {
System.out.println(i);
}
一個更有效的解決方案是將打印偶數(每秒),這是不3的倍數,(每第三個數字)
for (int i = 2; i < n; i += 6) {
System.out.println(i);
if (i + 2 < n)
System.out.println(i + 2);
}
模量操作是昂貴的,並且這將打印兩個數與每個循環,而不是每六個環兩個數字。
我更喜歡這個解決方案。但是如果n很奇怪會發生什麼?例如。讓'n = 3'。循環將不會觸發,因爲條件不成立。 – Makoto 2014-09-20 05:03:54
@Makoto是真的。彼得的代碼很好。 :) – 2014-09-20 05:09:43
@Makoto好點,它將無法打印出最後一些數字。 – 2014-09-22 18:01:40
我使用位運算符來獲得最佳性能(如果(i & 1) == 0
,我是偶數)。因爲偶數中的偶數總是有0位數。
public class Example {
public static void main(String[] args) {
int n1 = 0;
int n2 = 100;
for (int i = n1; i < n2; i++) {
if (((i & 1) == 0)) {
if (i % 3 != 0) {
System.out.print(i + " ");
}
}
}
}
}
// Result:
// 2 4 8 10 14 16 20 22 26 28 32 34 38 40 44 46 50 52 56 58 62 64 68 70 74 76 80 82 86 88 92 94 98
有更好的方法,例如3534%3 == 0,我們有:所有數字(3 + 5 + 3 + 4)= 15,和15%的3 == 0總和...讓我們的代碼遵循這個。
當n很大時,例如n2 = 99999999999999,所有數字的總和爲(9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9)% 3 == 0,位操作符是非常有意義的:)
@SotiriosDelimanolis:呃...... 30 ... – Makoto 2014-09-20 04:27:45
你知道'&&'和'!'操作符嗎? – Mephy 2014-09-20 04:27:46
3或9將不會被打印。它只打印2整除的數字! – AlexS 2014-09-20 04:29:40