Наименьшая система счисления

      Комментарии к записи Наименьшая система счисления отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3384

    Задача взята с acmp.ru:

    Известно, что основанием позиционной системы счисления называют количество различных символов, используемых для записи чисел в данной системе счисления. Также известно, что любое число x в b-ичной системе счисления имеет вид x=a0∙b0+a1∙b1+…+an∙bn, где b ≥ 2 и 0 ≤ ai < b.
    Для записи чисел в b-ичной системе счисления, где b ≤ 36, могут быть использованы первые b символов из следующего списка 0,1,…, 9, A, B, …, Z. Например, для записи чисел в троичной системы используются символы 0, 1, 2, а в двенадцатеричной — 0,1,…, 9, A, B.
    Требуется написать программу, которая по входной строке S определит, является ли данная строка записью числа в системе счисления, с основанием не большим 36, и, если является, определит минимальное основание этой системы счисления.

    Входные данные
    Входной файл INPUT.TXT содержит в единственной строке входную строку. Длина строки не превышает 255. Все символы строки имеют коды от 32 до 127.

    Выходные данные
    Выходной файл OUTPUT.TXT должен содержать одно число. Если строка является записью числа в некоторой системе счисления, то нужно вывести минимальное основание такой системы счисления. Иначе вывести -1.

    Примеры

    INPUT.TXTOUTPUT.TXT
    11234
    2ABCDEF16
    3AD%AF-1

    Разбор решения задачи:

    Блок-схема алгоритма:

    Исходный код решения на C#:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1 {
        class Program {
            static void Main(string[] args) {
                int max = 0;
                StreamReader sr = new StreamReader("input.txt");
                string str = sr.ReadLine();
                sr.Close();
    
                if (str == null) return;
                if (str.Length > 255) return;
    
                string upper_str = str.ToUpper();
                max = upper_str[0];
    
                bool flag = false;
    
                foreach (char symbol in upper_str) {
                    if ((symbol >= '0' && symbol <= '9') || (symbol >= 'A' && symbol <= 'Z')) {
                        if (symbol > max) {
                            max = symbol;
                        }
                    }
                    else {
                        flag = true;
                        break;
                    }
    
                }
    
                StreamWriter sw = new StreamWriter("output.txt");
                if (flag) {
                    sw.WriteLine("-1");
                }
                else {
                    if (max >= '0' && max <= '9') {
                        sw.WriteLine(max - 47);
                    }
                    else if (max >= 'A' && max <= 'Z') {
                        sw.WriteLine(max - 54);
                    }
                    else sw.WriteLine("-1");
                }
                sw.Close();
            }
        }
    }

    Исходный файл предоставляется в кодировке win-1251. При помощи метода StreamReader считывается значение входного файла, создается переменная max для нахождения максимального значения кода символа по таблице ASCII среди всех входных символов считанной строки. Если файл пуст – исполнение программы прерывается. Если длина файла превышает 255 символов – исполнение программы прерывается. Затем каждый символ строки приводится к верхнему регистру, создается массив символов upper_str, таким образом уменьшается интервал значений символов кода при проверке. Переменной max присваивается значение первого символа. Создается переменная flag для того, чтобы отследить появление символа, который не является латинской буквой или цифрой.
    Сравнение двух символов производится по значению их кодов – чей код больше. Для каждого юникода символа в массиве upper_str производится проверка, является ли он цифрой (принадлежит ли он интервалам от 0 до 9) либо латинской буквой (принадлежит интервалам от A до Z). Если код проверяемого символа больше переменной max, его значение заносится в переменную max, иначе переменной flag присваивается значение true, что означает, что входной символ не является заглавной буквой латинского алфавита или цифрой и цикл останавливается.
    Затем создается выходной файл методом StreamWriter. Если переменная flag равна true, то в выходной файл записывается «-1», что значит, что при вводе был применен недопустимый символ. Если значение переменной max является цифрой, то наименьшая система счисления строки будет равна max-47, так как разница между значением цифры и значением кода ее символа равна 47. Если переменная max не попадает в этот интервал, то производится проверка, является ли переменная max латинской буквой. Если является, то наименьшая система счисления строки будет равна max-54, так как в интервале от 57 (код цифры 9) до 65 код буквы А) содержатся коды недопустимых символов (не буквы и не цифры). В противном случае выводится «-1».

Для ответа в этой теме необходимо авторизоваться.