Разбивка int на цифры и загрузка в список (решено)
|
|
Core | Дата: Вторник, 15 Сентября 2020, 20:51 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Каким образом можно разбить int на отдельные цифры, и загрузить в список? На пример: было а стало Код var list = new List<int>{8,6,7,5};
Сообщение отредактировал Core - Суббота, 19 Сентября 2020, 12:20 |
|
| |
LLL | Дата: Вторник, 15 Сентября 2020, 21:01 | Сообщение # 2 |
участник
Сейчас нет на сайте
| можно ToString и Parse юзать. Ну т.е. через string это сделать.
|
|
| |
Core | Дата: Вторник, 15 Сентября 2020, 21:30 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| LLL, Прочел документацию и все равно не представляю, как именно использовать Parse в моем случае.
|
|
| |
DivES | Дата: Вторник, 15 Сентября 2020, 21:56 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Core, так а в чём, собственно, проблема? Переводишь из целочисленного типа в строковый с помощью метода ToString(). Затем хотя бы тем же циклом с перебором заполняешь свой список символами из строки (учитывая, что строка — коллекция символов; доступ осуществляется по []). Всё же в течение пары минут нагугливается. метод ToString(), сам String
|
|
| |
drcrack | Дата: Вторник, 15 Сентября 2020, 23:01 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Код var a = 87650000; var list = new List<int>(16);
while(a > 0) { list.Insert(0, a % 10); a /= 10; }
(Список сразу аллоцируется на 16 элементов — ближайшая степень двойки к максимальному числу цифр в int)
PS Кто-то скажет что лучше использовать Add и потом сделать Reverse, но на мой взгляд, это не особо нужная микрооптимизация которая толком ничего не ускоряет и портит семантику этого куска кода. Хотя, если это все обернуть в метод, можно сделать и с Reverse.
Сообщение отредактировал drcrack - Вторник, 15 Сентября 2020, 23:11 |
|
| |
Core | Дата: Среда, 16 Сентября 2020, 17:53 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| DivES, Те к символам из стринга можно обратиться с помощью []?
Код class Program { public static string FakeBin(string x) { var list = new List<int> { }; foreach (var i in x) Console.WriteLine(x[i]);//тут :p return x; } public static void Main(string[] args) { FakeBin("987987"); Console.ReadKey(); } }
У меня пишет, что индекс вне границ массива
Сообщение отредактировал Core - Среда, 16 Сентября 2020, 17:54 |
|
| |
DivES | Дата: Среда, 16 Сентября 2020, 20:35 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| Core, ты вообще понял, что ты сделал? Не отвечай, знаю, что не понял.
Для каждого i в x, где x — строка. А значит что? Правильно, i будут символами. И что же ты делаешь дальше? Пытаешься обратиться по индексу (i), который является первым символом твоей строки. А там что? Девятка. А массив какой длины? Шесть. Ну нельзя же так. Два варианта:
Код foreach (var i in x) list.Append(i);
или
Код for (int i = 0; i < x.Length(); ++i) list.Append(x[i]);
где Length() возвращает длину строки, а Append() — добавляет элемент к списку.
Без обид, надеюсь. Просто ты должен был использовать один из способов, а использовал оба. foreach как раз ведь и применяется, чтобы с индексами не возиться.
Сообщение отредактировал DivES - Среда, 16 Сентября 2020, 20:41 |
|
| |
Core | Дата: Среда, 16 Сентября 2020, 21:14 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| DivES, Спасибо за то, что уделяешь время таким нубам как я. Без шуток, ты - один из лучших обитателей gcup!
Свою ошибку понял и исправил. Все работает как нужно
|
|
| |
drcrack | Дата: Четверг, 17 Сентября 2020, 12:46 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Цитата Пытаешься обратиться по индексу (i), который является первым символом твоей строки. А там что? Девятка. А массив какой длины? Шесть. Был бы массив размером больше 9, все равно не помогло бы, т.к. у девятки ASCII код 57, а именно он и используется в качестве индекса в этом случае
|
|
| |
Core | Дата: Четверг, 17 Сентября 2020, 16:26 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Цитата drcrack ( ) у девятки ASCII код 57 Кстати, на счет этого...
Код namespace ConsoleApplication1 { class Program { public static string FakeBin(string x) { var y = ""; //Результат var bufOut = "";//Для конвертации в string int buf = 0;//Для конвертации в int, и всех последующих операций foreach (var i in x){ buf = Convert.ToInt32(i);//Конвертируем входные данные в int, и записываем в buf Console.WriteLine("i:"+i);//ДЕБАГ Вывод символа, который находится в i (входные данные) Console.WriteLine("buf:"+buf);//ДЕБАГ Вывод того, что записалось в buf, после конвертации i в int if (buf >= 5) { buf = 1; } else { buf = 0; }//Проверка значения цифры. Если больше, или равно 5, то заменяем содержимое на 1, иначе на 0 bufOut = Convert.ToString(buf);//Конвертируем все данные обратно в string y += bufOut;//Складываем все в один string (y) } Console.WriteLine("");//Отступ Console.WriteLine("Output: "+y);//Вывод выходных данных return y;//Возвращаем Выходные данные } public static void Main(string[] args) { FakeBin("52744248"); //В данном случае, выходные данные должны быть 10100001 Console.ReadKey();//Ожидание нажатия любой клавиши. } } }
Пытаюсь сделать что-то вроде генератора поддельного двоичного кода. В buf записывается код ASCII, а по задумке, там должна храниться цифра из стринга. Может есть функция, которая преобразовывает ASCII код цифры в саму цифру?
|
|
| |
drcrack | Дата: Четверг, 17 Сентября 2020, 22:24 | Сообщение # 11 |
старожил
Сейчас нет на сайте
| Цитата Может есть функция, которая преобразовывает ASCII код цифры в саму цифру?
Вот это все:
Код buf = Convert.ToInt32(i);//Конвертируем входные данные в int, и записываем в buf Console.WriteLine("i:"+i);//ДЕБАГ Вывод символа, который находится в i (входные данные) Console.WriteLine("buf:"+buf);//ДЕБАГ Вывод того, что записалось в buf, после конвертации i в int if (buf >= 5) { buf = 1; } else { buf = 0; }//Проверка значения цифры. Если больше, или равно 5, то заменяем содержимое на 1, иначе на 0 bufOut = Convert.ToString(buf);//Конвертируем все данные обратно в string y += bufOut;//Складываем все в один string (y)
Делается одной строчкой:
Код y += (char) ('0' + (i - '0') / 5);
PS Если это делается часто, лучше использовать StringBuilder чтобы не плодить новые строки на каждой итерации (каждый лишний обьект приближает сборку мусора, а также замедляет ее)
Сообщение отредактировал drcrack - Четверг, 17 Сентября 2020, 22:37 |
|
| |
Core | Дата: Пятница, 18 Сентября 2020, 15:58 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Цитата drcrack ( ) Делается одной строчкой: Не очень понимаю такой синтаксис. Можно подробнее рассказать о том, что за что отвечает? :'p
Сообщение отредактировал Core - Пятница, 18 Сентября 2020, 15:59 |
|
| |
drcrack | Дата: Пятница, 18 Сентября 2020, 16:56 | Сообщение # 13 |
старожил
Сейчас нет на сайте
| i - '0' возвращает разницу между символом i и символом 0 для цифр это совпадает с их числовым значением т.к. они идут подряд начиная с '0' далее это делится на 5 челочисленным делением, что для 0-4 дает 0, а для 5-9 дает 1 далее к '0' прибавляется то что получилось (0 или 1), получается либо '0' либо следующий символ т.е. '1' ну и (char) конвертирует результат в символ т.к. после сложения '0' с числом получится число и если убрать (char) то в строке будут ascii коды
Сообщение отредактировал drcrack - Пятница, 18 Сентября 2020, 16:57 |
|
| |
Core | Дата: Пятница, 18 Сентября 2020, 17:49 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| drcrack, Спасибо за помощь. =)
|
|
| |
OpenGOO | Дата: Суббота, 19 Сентября 2020, 10:54 | Сообщение # 15 |
почти ветеран
Сейчас нет на сайте
| вот ещё вариант
Код int value = 8765; var list = new List<int>(); while (true) { int remainder; value = Math.DivRem(value, 10, out remainder); list.Insert(0, remainder); if (value == 0) { break; } }
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |