2013-05-17 4 views
0

"while"루프를 사용하여 C#에서 "fizz-buzz"를 해결하면 먼저 3과 5의 배수 (15의 배수)를 찾아서 아래 3과 5의 배수. I는 최종 결과 아래와 같이 모두 3, 5 (15의 배수)의 배수로로 이동 한 후 (3, 5) 제의 배수로를 필터링하기위한 코드를 작성하는 경우C#에서 fizz 버즈를 이해하면

int myval = 0; 

while (myval < 100) 
{ 
    myval = myval + 1; 

    if (myval % 15 == 0) 
    { 
     listBox1.Items.Add("fizzbuzz"); 
    } 
    else if (myval % 3 == 0) 
    { 
     listBox1.Items.Add("fizz"); 
    } 
    else if (myval % 5 == 0) 
    { 
     listBox1.Items.Add("buzz"); 
    } 
    else 
    { 
     listBox1.Items.Add(myval); 
    } 
} 

는 오직 3 소다 (배수를 나타낸다) 및 버즈 (5의 배수)를 사용합니다 (3과 5의 배수). 누구도이 IDE의 이유가 무엇인지 알지 못해 어떤 오류도 표시하지 않습니다.

myval = 0; 

while (myval < 100) 
{ 
    myval = myval + 1; 

    if (myval % 3 == 0) 
    { 
     listBox1.Items.Add("fizz"); 
    } 
    else if (myval % 5 == 0) 
    { 
     listBox1.Items.Add("buzz"); 
    } 
    else if (myval % 15 == 0) 
    { 
     listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5 
    } 
    else 
    { 
     listBox1.Items.Add(myval); 
    } 
} 

end result without fizz-buzz multiples of both 3 and 5

+2

코드가 작동된다.else if를 사용하고 있기 때문에 하나 이상의 논리적 인 결정을 허용하지 않습니다. – emd

+0

"if 문"을 바꿔서 올바르게 쓰는 법을 설명해 주시겠습니까 – scylla

+0

@scylla 아래 답변을 많이 읽고 이해할 수 있다고 생각합니까? 그렇지 않다면 우리가 너에게 무엇을 말하기로되어 있나? – Nolonar

답변

4

if-else 문 순차적으로 처리된다는 사실로 귀결. true으로 평가되는 조건이 발생하는 즉시 다른 else if 절이 건너 뜁니다.

ab이 모두 true이라고 가정합니다. 당신이

if (a) { 
    Foo1(); 
} 
else if (b) { 
    Foo2(); 
} 

를 쓸 때 당신은 Foo1Foo2 모두를 실행하지 않습니다. atrue이므로 Foo1이 실행되고 b은 평가되지 않습니다.

이제 문제를 고려하십시오. 숫자 15를 생각해 봅시다. 3 개의 후보 약수 모두 3, 5, 15가이 숫자로 나눕니다. 15의 배수 이후

if (myval % 3 == 0) 
{ 
    listBox1.Items.Add("fizz"); 
} 
else if (myval % 5 == 0) 
{ 
    listBox1.Items.Add("buzz"); 
} 
else if (myval % 15 == 0) 
{ 
    listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5 
} 
else 
{ 
    listBox1.Items.Add(myval); 
} 

3 (및 5)의 배수, 당신도 15의 배수의 myval % 15 == 0 테스트에 도달하지 않습니다.

+0

그러나 배수의 순서를 변경하지 않고 "if-else 문"만 변경하여이 문제를 해결할 수있는 방법이 있습니다. – scylla

+1

간단한 'if ... else if ... else if ...'에서 처리하려면 명령 순서에주의해야합니다. 'if (isFizz &&! isBuzz)'형식 접근 방식을 사용할 수 있지만 더 복잡합니다. 이 문제는 본질적으로 복잡합니다. –

6

처음 두 조건을 만족하기 때문입니다. 그래서 그것은 세 번째 else 문을 결코 치지 않습니다.

+1

+1, OP는 'myval % 15'을 확인한 다음 거기에서 아래쪽으로 이동해야합니다. –

+1

@JensKloster - 예. 클래식 인터뷰 질문 : –

+0

이것이 가장 쉬운 방법입니다. Jens 감사합니다! – scylla

2

3과 5로 나눌 수있는 것이 또한 3과 5로 나눌 수 있기 때문입니다. 이러한 조건 중 하나를 먼저 잡으면 나중에 조건이 확인되지 않습니다. 나는 이것이 원래의 질문이 아니었다 알고

var resultString = ""; 
if(myval % 3 == 0) resultString += "fizz"; 
if(myval % 5 == 0) resultString += "buzz"; 
if(myval % 5 != 0 && myval % 3 != 0) resultString += myval; 
listBox1.Items.Add(resultString); 

이것은 15

또한 %에 대해 별도의 검사를 필요로하지 않고 모든 조건을 인쇄 할 수 있지만 :

또한 지금처럼 쓸 수 일반적으로 누군가가 while 루프를 사용하여 일련의 숫자를 순환합니다. 그에 대한 for 루프를 사용

for(int myval = 0; myval <= 100; myval++) 
{ 
    // code goes here 
} 
1

나는 항상이는 약간 다른 방식으로 해결 : 추가 할 문자열을 구성하여.

for (int myVal = 0; myVal < 100; myVal++) 
{ 
    string fb = ""; 

    if ((myVal % 3) == 0) { fb = "fizz"; } 
    if ((myVal % 5) == 0) { fb += "buzz"; } 

    // Handle the case where it isn't divisible by 3 or 5: 
    if (fb == "") { fb = myVal.ToString(); } 

    // "output" the string. 
    listBox1.Items.Add(fb); 
} 
+1

숫자가 3 또는 5로 나눌 수있는 경우가 누락 된 것 같습니다. – Chris

+1

코드가 수정되었습니다. 먼저 동료를 검토해야합니다. – Nolonar

+1

제안 된 편집 결과가 거절 된 것처럼 보입니다 ... 변경된 내용은 다음과 같습니다. if (fb! = "") {listBox1.Items.Add (fb); }'가 다음과 같이 변경되었습니다 : if (fb == "") {fb = myVal.ToString(); } listBox1.Items.Add (fb); ' – Nolonar

0

당신은 채우기 위해이 방법을 사용할 수 있습니다 Listbox : 예상대로

foreach (int i in Enumerable.Range(1,100)){ 
     string str = null; 
     listBox1.Items.Add((str = (i % 3 == 0 ? "fizz" : "") 
           + (i % 5 == 0 ? "buzz" : "")) == "" 
           ? i.ToString() : str); 
    } 
관련 문제