@xilit

Как разбить число на равные части?

Вот мой первый опыт работы с C#.
Задачу мне поставили следующую:
Необходимо написать конвертер чисел в двоичной системе в 16-ричную и 8-ричную.
Пользователь вводит числа, которые должны храниться в массиве, а потом нажав на номер индекса получить введеное число в других (указанных выше) СС. использование стандартных функций C# для решение этой задачи запрещено. Т.е. все арифметические действия с числами должна производить моя программа.

Проблема в том, что я не знаю какой функцией сделать разбивку двоичного числа на группы по 3 и при этом разбивка должна происходить справо на лево и старший бит должен добиваться нолями до 3 чисел, если их не хватает.

Я предполагал копировать от числа последние 3 символа -> присваивать их переменной -> конвертировать -> удалять из первоначального числа 3 уже ненужные использованные числа -> копировать 3 последних и далее по кругу, но дело в том, что у меня не копируются последние 3, и я не могу придумать, как заполнить старший бит нолями, если в нем будет недостаточно чисел.

Понимаю, что это коряво, но ведь должно работать?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using System.Text.RegularExpressions;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Создаем массив
            string[] nums = new string[12];
            // Создаем временный массив для конвертации чисел
            string[] temp = new string[3];
            // Количество символов в группе для перевода в восьмеричную систему
            int oct = 3;
            
            // Получаем двоичные числа для конвертации
            Console.WriteLine("Введите 12 чисел");
            for (int i = 0; i < nums.Length; i++)
            {
                Console.Write("{0} - е число: ", i + 0);
                nums[i] = Console.ReadLine();
            }
            
            // Получаем индекс конвертируемого числа
            Console.WriteLine("Выберите число по порядковому номеру, для конвертации.");
            
            // Передаем переменной значение, хранящееся в массиве
            int s;
            s = Int32.Parse(Console.ReadLine());

            // Тут должна быть работа с переменной. 
            int binary;
            // Переменная binary получает первые 3 числа с ней проводятся арифметические операции, и т.д.
            // В итоге должно получится число, которое будет результатом перевода из двоичной системы в восьмеричную.

            string b = s.Length;

            Console.WriteLine(nums[s]);
            Console.ReadLine();
        }
    }
}


Подскажите о каких функциях мне надо почитать, чтобы решить задачу.

P.S.
Еще пробовал реализовать разбивку регулярными выражениями, но там совсем запутался.
Для меня вопрос очень сложный, поэтому в сложности укажу сложный.
  • Вопрос задан
  • 2335 просмотров
Пригласить эксперта
Ответы на вопрос 3
@OwDafuq
В каком смысле "разбить число на равные части"?
Например так: 100 000 000?
Используйте маску N0:
Console.WriteLine((100000000).ToString("N0")); // output: 100 000 000

Либо, если число всегда одной длины, то можно сделать свою маску:
Console.WriteLine(string.Format("{0:### ### ###}", 100000000)); // output: 100 000 000


p.s. в случае бинарных чисел - можно развернуть массив в обратную сторону и получается он "справа налево"
Ответ написан
Комментировать
@xilit Автор вопроса
Спасибо. Длинна числа каждый раз может быть разная, просто для перевода из одной системы счисления в другую необходимо работать с группами чисел по к примеру по 3. И мне необходимо каждую группу обрабатывать отдельно. т.е. мне ее надо потом передавать переменной, и так пока не пройду по всему числу
Ответ написан
Комментировать
@zhaparoff
А какой вообще смысл переводить введенные строки в числа?
Просто храните все и обрабатывайте как строки.
Исходный массив, как я понял, в двоичной системе? { "10001", "1202", и т.д. }?

Просто откусывайте от каждого числа 3 (для восьмеричной) или 4 (для 16-ричной системы) символа с конца (справа); дополняйте до 3х или 4х символов нулями слева (чтобы корректно обработать самую старшую часть); и обычным switch выбирайте соответствующее число в восьмеричной или 16-ричной системе:
"101" -> "5" (oct)
"1101" -> "D" (hex)

Можно конечно заморочиться, и перевод сделать стандартным методом деления и проверки остатка в цикле - в данном случае проверять по 1 биту и накапливать их. Но этот метод хорош для универсальных конвертеров, а для узкоспециализированного как в этом случае вполне подойдет словарный перевод.

Странное требование не использовать стандартные методы C# - я понимаю, что это скорее всего учебная задача, но вся суть языка C# в очень развитой объемной библиотеке "из коробки".
Console.ReadLine и Int32.Parse - тоже стандартные функции... Так что вообще без стандартных никак не выйдет, это 100%.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы