Проблема с соответствующими операциями в c# - PullRequest
0 голосов
/ 13 января 2020

У меня проблема с решением в этом примере. Скажите, пожалуйста, Операции (codeKata):

У вас есть строка с N числами, каждые 2 числа после операции (?) Возвращают следующее число в этой строке. Напишите функцию, которая возвращает новую строку с соответствующими операциями:

1) сложение,

2) вычитание,

3) умножение,

4) деление .

example: for string stringNumbers = "9 4 5 20 25"

 your function must return:

"subtraction, multiplication, addition"

потому что,

  • 9 - 4 = 5 - вычитание,
  • 4 * 5 = 20 - умножение,
  • 5 + 20 = 25 - добавление,

    Мой код:

    int x = 0,add = 0, multi = 0, sub = 0, divi = 0, z = 0;
    var v = stringNumbers.Split(' ').ToArray();
    string s = "";
    if (v.Length >= 3)
    {
        for (int i = 0; i < v.Length; i++)
            for (int j = i + 1; j < v.Length; j++)
                for (int k = j + 1; k < v.Length; k++)
                {
                    Console.WriteLine(k);
                    x = int.Parse(v[i]);
                    z = int.Parse(v[j]);
                    add = x + z;
                    multi = x * z;
                    sub = x - z;
                    divi = x / z;
    
                    if (add == int.Parse(v[k]))
                    {
                        s += "addition, ";
                    }
                    else if (sub == int.Parse(v[k]))
                    {
                        s += "subtraction, ";
                    }
                    else if (multi == int.Parse(v[k]))
                    {
                        s += "multiplication, ";
                    }
                    else if (divi == int.Parse(v[k]))
                    {
                        if (int.Parse(v[i]) != 0)
    
                            s += "division, ";
                    }
                    else
                    {
                        break;
                    }
                }
    }
    else
        return "";
    s = s.Remove(s.Length - 2, 2);
    return s;
    

Я прошел пробный тест, но не этот. Я не знаю, где проблема.

What is wrong ?

Спасибо за помощь! Это мой третий пост извините за ошибки.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Что-то вроде этого намного проще и будет выполнять sh то же самое без используемых вами слоев циклов:

public static string ProcessOperations(string numbers)
{
    string[] numberArray;
    string returnValue = string.Empty;

    numberArray = numbers.Split(' ');
    for (int i = 0; i < numberArray.Length - 2; i++)
    {
        if (int.TryParse(numberArray[i], out int a) &&
            int.TryParse(numberArray[i + 1], out int b) &&
            int.TryParse(numberArray[i + 2], out int c))
        {
            if (a + b == c)
                returnValue += "addition, ";
            else if (a - b == c)
                returnValue += "subtraction, ";
            else if (a * b == c)
                returnValue += "multiplication, ";
            else if (a / b == c)
                returnValue += "division, ";
        }
    }

    returnValue = returnValue.TrimEnd(new[] { ',', ' ' });

    return returnValue;
}

Тестирование с использованием единственного предоставленного вами значения:

?ProcessOperations("9 4 5 20 25");
subtraction, multiplication, addition

При этом используется один l oop, который работает до конечной позиции - 2. Затем он разбирает элементы в позиции i, i + 1 и i + 2a, b, и c). После этого он проверяет, какая арифметическая операция c используется для вычисления c из a и b.

Перед возвратом есть TrimEnd, чтобы удалить любые ложные запятые и пробелы.

Примечания: нет проверки ошибок, нет арифметической операции c даст результат. Деление является целочисленным делением, поэтому не будет работать с числами с плавающей запятой.

0 голосов
/ 13 января 2020

Допустим, v.length - это 5.

Вы хотите выполнить следующие проходы цикла:

  1. i = 0, j = 1, k = 2
  2. i = 1, j = 2, k = 3
  3. i = 2, j = 3, k = 4

Но это не то, что вы делаете. Вы можете j и k измениться полу-независимо от i.

  1. i = 0, j = 1, k = 2
  2. i = 0, j = 1, k = 3
  3. i = 0, j = 1, k = 4
  4. i = 0, j = 2, k = 3
  5. i = 0, j = 2, k = 4
  6. i = 0, j = 3, k = 4
  7. i = 1, j = 2, k = 3
  8. i = 1, j = 2, k = 4
  9. i = 1, j = 3, k = 4
  10. i = 2, j = 3, k = 4

Чтобы получить желаемый результат, у вас должен быть только один l oop. Вы можете получить другие значения из переменной l oop.

Вы можете получить j и k из i следующим образом:

for (int i = 0; i < v.Length - 2; ++i) {
   int j = i + 1;
   int k = i + 2;
   ...
}

Или можете выведите i и j из k следующим образом:

for (int k = 2; k < v.Length; ++k) {
   int i = k - 2;
   int j = k - 1;
   ...
}

В любом случае, проверка if (v.Length >= 3) бесполезна. for уже выполняет эквивалентную проверку. Я также рекомендую анализировать элементы v один раз (перед основным l oop), а не выполнять их повторный анализ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...