Решаю задачу:
В ЕГЭ по математике было решено не давать задач, в которых используются числа, большие 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 оно или нет. Как его исправить, чтобы он мог считать любые числа, разделённые любыми символами, и двузначное и пятизначное (и т. д.)?
Набросал на скорую руку вариант со вложенным циклом
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. Чуть поправил алгоритм
Простой алгоритм с одним циклом и без индексов
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();
}
}
}
}
Вот более оптимальный алгоритм, который проверяет только достаточное условие невалидного выражения: просматриваем строку, если встречаем цифру - проверяем не больше ли она 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Добрый деньНаписал приложение-1 на C#, которое создает папку
Не могу справится с, на первый взгляд,простой задачей: В строке найти количество вхождений каждой буквыСоздал класс с двумя свойствами
Выдаёт ошибку: SQL logic error near "insert": syntax error" Вот код:
Паттерн producer/consumer достаточно часто встречается в многопоточном программированииЕго смысл состоит в том, что один или несколько потоков...