Не срабатывает последнее условие в FizzBuzz

118
14 августа 2019, 17:30

Указываем число n. В диапазоне от 1 до n выводим каждый элемент, но только стрингой. Если число кратное 3 - заменяем вывод на "Fizz", если кратно 5 - заменяем вывод на "Buzz", а если кратно и 3 и 5 - на "FizzBuzz"

В моей реализации первых два условия выполняется, третье не выполняется никогда:

static IList<string> FizzBuzz(int n) {
        List<string> result = new List<string>();
        for(int i =1; i<=n; i++)
        {
            if (i % 3 == 0)
                result.Add("Fizz");
            else if (i % 5 == 0)
                result.Add("Buzz");
            else if (i % 15 == 0)
                result.Add("FizzBuzz");
            else
                result.Add(i.ToString());
        }
        foreach (var item in result)
            Console.WriteLine(item);
        return result;
}

Ожидаемый результат:

n = 15,

Вывод:

[
    "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    **"FizzBuzz"**
]

А по факту имеем:

 "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    **"Fizz"**

Как пофиксить, чтобы проверка на кратность на 3 не прерывала проверку на кратность на 3 и 5?
Есть какой либо более шустрый способ решения этой же задачи?

Answer 1

Если число делится на 15, то оно делится и на 3 и на 5.

Поэтому проверку делимости на 15 нужно делать раньше:

if (i % 15 == 0) result.Add("FizzBuzz");
else if (i % 3 == 0) result.Add("Fizz");
else if (i % 5 == 0) result.Add("Buzz");
else result.Add(i.ToString());

P.S. Если убрать все else, то «Fizz» и «Buzz» будут выводиться вместе с «FizzBuzz», что, вроде, нежелательно.
P.S.S. Если ввести в гугл «C# FizzBuzz» найдется множество решений этой задачи (например), которые можно сравнить со своим.

Answer 2

Дело в том, что у вас срабатывает первый if (i % 3 == 0) на число 15, т.к. оно соответствует проверке. Я бы предложил проверять сначало на if (i % 15 == 0), а потом уже на 3 и 5. И тут else if (i % 15 == 0) вы проверяете, кратное ли это число - 15, а не 3 и 5. Я думаю данное решение будет неплохим.

if (i % 3 == 0 && i % 5 == 0)  
    {  
        result.Add("FizzBuzz");  
    }  
    else if (i % 3 == 0)  
    {  
       result.Add("Fizz");  
    }  
    else if (i % 5 == 0)  
    {  
       result.Add("Buzz"); 
    }  
    else  
    {  
        result.Add(i.ToString());  
    }  
Answer 3

Прозрение пришло ко мне! Я случайно додумался убрать все else

static IList<string> FizzBuzz(int n)
    {
        List<string> result = new List<string>();
        for(int i =1; i<=n; i++)
        {
            if (i % 3 == 0)
                result.Add("Fizz");
            if (i % 5 == 0)
                result.Add("Buzz");
            if (i % 15 == 0)
                result.Add("FizzBuzz");
            else
                result.Add(i.ToString());
        }
        foreach (var item in result)
            Console.WriteLine(item);
        return result;
    }

Мне кажется выглядит ужасно, но зато работает.

READ ALSO
Failed to load xml document {ETW loggiing.Samples-EventSourceDemos-EventLog}. Incorrect function

Failed to load xml document {ETW loggiing.Samples-EventSourceDemos-EventLog}. Incorrect function

Использую ETW Logging чтобы записат лог в Windows Event ViewerУстановил пакет Microsoft

103
Сравнение русских и английский букв C#

Сравнение русских и английский букв C#

Есть набор символов, которые одинаково выглядят как на русском так и на английском языках (А,В,С,Е,Н,К,М,О,Р,Т,Х)Мне хотелось бы сравнивать эти...

106
Использование библиотеки jQuery contextMenu

Использование библиотеки jQuery contextMenu

Скачал с nuget jQuery contextMenuВсё необходимое подключил к проекту

99