Поиск чисел в string

259
26 ноября 2017, 11:51

Решаю задачу:

В ЕГЭ по математике было решено не давать задач, в которых используются числа, большие 5, например, 6, 10 и т.п. (они теперь считаются трудными и не обязательными для изучения). Вводится уравнение. Требуется определить, можно ли его давать в ЕГЭ (в уравнении могут присутствовать любые символы-нецифры, а также натуральные числа).

моё решение:

string @int = string.Empty;
foreach (char ch in s.ToCharArray())
    if (char.IsDigit(ch))
    {
        @int += ch.ToString();
        int result = int.Parse(@int);
        if (result > 5)
            {
            ege = false;
            }
        @int = string.Empty;
    }

Этот код считывает число (однозначное) из string и проверяет больше 5 оно или нет. Как его исправить, чтобы он мог считать любые числа, разделённые любыми символами, и двузначное и пятизначное (и т. д.)?

Answer 1

Набросал на скорую руку вариант со вложенным циклом

public bool IsValidString(string str)
{
    if (string.IsNullOrEmpty(str)) return true;
    for (var i = 0; i < str.Length; i++)
    {
        if (char.IsDigit(str[i]))
        {
            for (var j = i + 1; j <= str.Length; j++)
            {
                if ((j == str.Length) || !char.IsDigit(str[j]))
                {                       
                    int n;
                    if (int.TryParse(str.Substring(i, j - i), out n))
                    {
                        if (n > 5) return false;
                    }
                    else return false;              
                    i = j;
                    break;
                }
            }
        }
    }
    return true;
}

также можно попробовать вариант с регуляркой, но регулярка будет медленней работать.

UPD. Чуть поправил алгоритм

Answer 2

Простой алгоритм с одним циклом и без индексов

static IEnumerable<int> ParseNumbers(string source)
{
    var currentNumber = new StringBuilder();
    source += "!"; //Добавляем не цифру в конец строки, чтобы строка гарантированно оканчивалась не цифрой
    foreach (var ch in source)
    {
        if (char.IsDigit(ch))
            currentNumber.Append(ch);
        else
        {
            if (currentNumber.Length > 0)
            {
                yield return int.Parse(currentNumber.ToString());
                currentNumber.Clear();
            }
        }
    }
}
Answer 3

Вот более оптимальный алгоритм, который проверяет только достаточное условие невалидного выражения: просматриваем строку, если встречаем цифру - проверяем не больше ли она 5, если так - возврат false, иначе если она больше 0 смотрим следующий символ и если он цифровой - возврат false. Если цикл завершился успешно - возврат true.

static bool IsValid(string s)
{
    for (int i = 0; i < s.Length; ++i)
        if (char.IsDigit(s[i]))
        {
            if (s[i] > '5') return false;
            if (s[i] > '0' && i + 1 < s.Length && char.IsDigit(s[i + 1])) return false;
        }
    return true;
}

Проверяем:

Console.WriteLine(IsValid("2x+1=3"));   // True
Console.WriteLine(IsValid("4x+6=3"));   // False
Console.WriteLine(IsValid("2x+4=10"));  // False
Console.WriteLine(IsValid("20x+1=3"));  // False
Console.WriteLine(IsValid("2x+01=3"));  // True
Console.WriteLine(IsValid("2x+1=03"));  // True
Console.WriteLine(IsValid("2x+1=003")); // True
Console.WriteLine(IsValid("2x+1=030")); // False
READ ALSO
Папка создается не в нужном месте C#

Папка создается не в нужном месте C#

Добрый деньНаписал приложение-1 на C#, которое создает папку

220
Mассивы класса c шарп

Mассивы класса c шарп

Не могу справится с, на первый взгляд,простой задачей: В строке найти количество вхождений каждой буквыСоздал класс с двумя свойствами

249
Ошибка: SQL logic error near &ldquo;insert&rdquo;: syntax error"

Ошибка: SQL logic error near “insert”: syntax error"

Выдаёт ошибку: SQL logic error near "insert": syntax error" Вот код:

204
Имплементация Producer/Consumer pattern

Имплементация Producer/Consumer pattern

Паттерн producer/consumer достаточно часто встречается в многопоточном программированииЕго смысл состоит в том, что один или несколько потоков...

209