2012-05-16 1 views
7

Для тех, кто не знает, FizzBuzz следующая проблема:FizzBuzz без И оператор

Напишите программу, которая печатает числа от 1 до 100. Но для кратные три печати «Fizz» вместо от числа и для кратных пяти печатных «Buzz». Для чисел, кратных , оба три и пять печатают «FizzBuzz».

решения Каждого FizzBuzz я нахожу, либо какое-то сумасшедшее эзотерическое решение сделали ради оригинальна, или ваших основных, если-то еще цепей:

for(int i = 1; i <= 100; i++) { 

if(i % 3 == 0 && i % 5 == 0) { 
    System.out.println("FizzBuzz"); 
} else if (i % 3 == 0) { 
    System.out.println("Fizz"); 
} else if (i % 5 == 0) { 
    System.out.println("Buzz"); 
} else { 
    System.out.println(i); 
} 
} 

Ищу простое решение, которое стремится выведите инструкцию FizzBuzz. Я имею это в виду:

for(int i = 1; i <= 100; i++) { 

if (i % 3 == 0) 
    System.out.print("Fizz"); 
if (i % 5 == 0) 
    System.out.println("Buzz") 
else 
    System.out.println(i); 
} 

Но это не работает. Я предполагаю, что он сможет распечатать FizzBuzz, введя оба ifs, для Fizz и для Buzz, но если это число, например, 3, оно будет печатать Fizz3. Как мне избежать этого?

+0

Потому что это должно быть 'else if' вместо вашего второго оператора' if';) –

+0

@ThomasJungblut Нет, потому что тогда случай FizzBuzz обязательно не сработает. –

+0

@ThomasJungblut, Нет, он хочет объединить Fizz и Buzz вместе, поэтому он намеренно упускает первое, если. – Igor

ответ

9

Что вы пытаетесь сделать, это

if (a) 
    ... 
if (b) 
    ... 
else // if neigther a nor b 
    ... 

Это просто невозможно. else может принадлежать только одному if. Вы должны пойти с чуть более длинным вариантом.

Чтобы не делать лишнюю оценку оператора по модулю, можно сформулировать тело цикла, как

boolean fizz = i % 3 == 0; 
boolean buzz = i % 5 == 0; 

if (fizz) 
    System.out.print("Fizz"); 
if (buzz) 
    System.out.print("Buzz"); 
if (!(fizz || buzz)) 
    System.out.print(i); 

System.out.println(); 

Еще один будет

String result = ""; 

if (i % 3 == 0) result = "Fizz"; 
if (i % 5 == 0) result += "Buzz"; 
if (result == "") result += i; 

System.out.println(result); 
+1

А, но в нем есть '&&'. ;-) –

+0

Изменено в соответствии с правилом демона ... это обман? :-) Кстати, это, вероятно, принадлежит http://codegolf.stackexchange.com/ – aioobe

+1

Ну, я только шутил. Только в названии упоминается оператор AND конкретно. Я думаю, что реальная цель состоит в том, что у нее есть только два оператора if плюс номер случая, который включает ваше решение. Кроме того, есть +1. –

2

Если ваша единственная цель состоит в том, чтобы избежать использования &&, вы могли бы использовать двойное отрицание и законы де Моргана:

for(int i = 1; i <= 100; i++) { 

    if(!(i % 3 != 0 || i % 5 != 0)) { 
     System.out.println("FizzBuzz"); 
    } else if (i % 3 == 0) { 
     System.out.println("Fizz"); 
    } else if (i % 5 == 0) { 
     System.out.println("Buzz"); 
    } else { 
     System.out.println(i); 
    } 
} 

Вы можете избежать && используя тот факт, что i % 3 == 0 и i % 5 == 0 подразумевает i % 15 == 0, согласно RFC1337's answer.

Другим решением является использование switch на оставшейся (по модулю 15, который в 5 раз 3):

for(int i = 1; i <= 100; i++) { 
    final int mod = i % 15; 
    switch (mod) { 
     case 0: 
     case 3: 
     case 6: 
     case 9: 
     case 12: 
      System.out.print("Fizz"); 
      if (mod != 0) break; 
     case 5: 
     case 10: 
      System.out.print("Buzz"); 
      break; 
     default: 
      System.out.print(i); 
    } 

    System.out.println(); 
} 
+0

просто сохраните i% 15 сверху, а не вычисляйте по модулю дважды. – ranman

+0

Хорошая точка @ранман, отредактированная. –

+0

Есть ли штраф за выполнение объявления заново и снова? Кажется, я помню, как вступал в эти годы и годы назад, но теперь я не могу найти никаких ссылок на это. – ranman

3

Вашим первой если заявление все в одиночку.

Итак, ваш код попадает в первый оператор, который является ТОЛЬКО оператором if, а затем переходит к следующему, что является оператором if/else.

RosettaCode имеет хороший пример без использования операторов ИО.

int i; 
    for (i = 0; i <= 100; i++) { 
      if ((i % 15) == 0) 
        cout << "FizzBuzz" << endl; 
      else if ((i % 3) == 0) 
        cout << "Fizz" << endl; 
      else if ((i % 5) == 0) 
        cout << "Buzz" << endl; 
      else 
        cout << i << endl; 
    } 
+0

Я думаю, что целью было повторное использование 'Fizz' при написании' FizzBuzz'. – aioobe

+1

@aioobe Да, и я думаю, что это может быть легко адаптировано с немного более гнездованием условностей. Я собирался предложить случай с переключателем, но [Platinum Azure] (http://stackoverflow.com/a/10620230/1397668) Уже был примером для этого. – RFC1337

0

Просто добавьте переменную флаг и использовать System.out.print:

package com.stackoverflow; 

public class FizzBuzz { 
    public static void main(String[] args) { 
     for (int i = 1; i <= 100; i++) { 
      boolean printed = false; 
      if (i % 3 == 0) { 
       printed = true; 
       System.out.print("Fizz"); 
      } 
      if (i % 5 == 0) { 
       printed = true; 
       System.out.print("Buzz"); 
      } 

      if (printed) { 
       System.out.println(); 
      } else { 
       System.out.println(i); 
      } 
     } 
    } 
} 
0

Это не вывезти, если заявления, но не использует & (а) оператор &, можно перевернуть бинарные операторы ,

//FizzBuzz Case 
if(!(a % 3 != 0 || a % 5 != 0)){ //flips 
    result[index] = "FizzBuzz"; 
    index++; 
    } 
0

Сумасшедшая хотя несвязанный решение сделано в Python3

#!/usr/bin/python3 

for i in range(1,100): 
    msg = "Fizz" * bool(i%3==0) 
    msg += "Buzz" * bool(i%5==0) 
    if not msg: 
     msg = i 
print(msg) 
0

Не используйте, если заявление вообще.

import java.util.*; 
import java.lang.*; 
import java.io.*; 
class FizzBuzz 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     String[] words = {"", "Fizz", "Buzz"}; 
     String[] nwords = {"", ""}; 

     for(int i = 1; i < 101; ++i) 
     { 
      int fp = (i % 3 == 0) ? 1 : 0; 
      int bp = ((i % 5 == 0) ? 1 : 0) * 2; 
      int np = ((fp > 0 || bp > 0) ? 1: 0); 

      nwords[0] = Integer.toString(i); 

      System.out.print(words[fp]); 
      System.out.print(words[bp]); 
      System.out.println(nwords[np]); 
     } 
    } 
} 

Посмотрите на ideone.

+0

недействителен coz (i% 3 == 0)? 1: 0 это утверждение if на самом деле – maxormo

1

Это мое решение. Конечно, это немного запутанно (как на кольцевой развязке), но я считаю, что это соответствует вашему требованию.

int main() 
{ 
    char fizzpass=0; 

    unsigned short index=0; 

    for(index=1;index<=100;index++) 
    { 
     if(0 == (index%3)) 
     { 
      printf("Fizz"); 
      fizzpass = 1; 
     } 

     if(0 == (index%5)) 
     { 
      if(1 == fizzpass) 
      {     
       fizzpass = 0; 
      } 

      printf("Buzz\n"); 
      continue; 
     } 

     if(1 == fizzpass) 
     { 
      fizzpass = 0; 
      printf("\n"); 
      continue; 
     } 

     printf("%d\n",index); 
    } 

    return 0; 
} 

С уважением.