Автор Тема: [Осваивающий, Продвинутый] Конвертация чисел в разные системы счисления и обратно  (Прочитано 10483 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4016
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Построить две функции для конвертации чисел в другую систему счисления и обратно следующего вида
; Название функции...........: DecToN($decnum, $base)
; Описание функции ..........: Конвертация числа в заданную систему счисления
; Входные параметры..........: $decnum - десятичное целое число
; ...........................: $base - основание системы счисления (не больше 10)
; Выходные параметры.........: Строка вида  'xxnyyyyy', где
; ...........................: xx - основание системы счисления (тоже что и  $base)
; ...........................: n - символ разделяющий основание системы счисления и представление числа
; ...........................: yyyy - представление числа в системе счисления с основанием $base


; Название функции...........: NToDec($nnum)
; Описание функции ..........: Конвертация числа в десятичную систему счисления
; Входные параметры..........: $nnum - число-строка в заданной системе счисления вида 'xxnyyyy'
; Выходные параметры.........: Число в десятичном представлении

Например, число 18118 имеет следующие представления в различных системах счисления (с учетом формата в условии задачи)
+-----------+-----------------------+
| Основание | Число                 |
+-----------+-----------------------+
| 2         | '2n100011011000110'   |
| 3         | '3n220212001'         |
| 4         | '4n10123012'          |
| 5         | '5n1034433'           |
| 6         | '6n215514'            |
| 7         | '7n103552'            |
| 8         | '8n43306'             |
| 9         | '9n26761'             |
+-----------+-----------------------+
Поэтому DecToN(18118, 6), к примеру, должно давать '6n215514', а NToDec('4n10123012') должно давать 18118.

Использование каких-либо сторонних библиотек запрещено. Код заключайте в тэг спойлера.

PS: Задача ориентировочно расчитана на осваивающих и продвинутых, но при желании и возможности новички так же могут присоединиться к решению

Русское сообщество AutoIt


Оффлайн Zaramot [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1160
  • Репутация: 653
  • Пол: Мужской
  • I ♥ AutoIt
    • Награды
  • Версия AutoIt: 3.3.8.1
AZJIO,
Там же пишут  [Осваивающий, Продвинутый] , а не Гуру  :D

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2706
  • Репутация: 1136
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Zaramot
Я думал что я продвинутый. А то я ещё хотел уже выложить вариант до шестнадцатеричной системы.

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 330
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
А я в AutoIt не Гуру. Мне можно.  ;D

(нажмите для показа/скрытия)
« Последнее редактирование: Март 12, 2012, 16:14:42 от C2H5OH »
Рано или поздно все станет понятно, все станет на свои места и выстроится в единую красивую схему, как кружева. Станет понятно, зачем все было нужно, потому что все будет правильно.

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4016

  • Автор темы
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
C2H5OH  [?]
Цитировать
А вы не знали что существуед единичная система счисления?
знали. но она интереса не представляет, только если ты не ребенок дошкольного возраста, который учиться считать на палочках :)
у тебя ошибка в обратной функции. она возвращает 0

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 330
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Цитировать
у тебя ошибка в обратной функции. она возвращает 0
Это я на ходу вдруг придумал добавить проверку на то что в числе попалась цифра больше чем основание системы счисления. :-[
Немного не туда поставил эту проверку... Уже исправил. :)

Оффлайн xCite [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 0
  • Пол: Мужской
    • Награды
Наконец-то победил))))
(нажмите для показа/скрытия)

Правда никаких проверок на правильность ввода не делается (в условии этого нет)
« Последнее редактирование: Март 12, 2012, 16:59:43 от xCite »

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 330
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Эээээ, нехорошо подсматривать чужой код...
Ты не используешь  фишку ASCII, хотя и вызываешь
Код: AutoIt [Выделить]
$NumArray = StringToASCIIArray($BaseNum)


Для твоих функций было бы логично использовать второй раз
Код: AutoIt [Выделить]
$NumArray = StringSplit($BaseNum, "")


А потом вместо мудрёного
Код: AutoIt [Выделить]
chr($NumArray[$i])

брать просто
Код: AutoIt [Выделить]
$NumArray[$i]


Русское сообщество AutoIt


Оффлайн xCite [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 0
  • Пол: Мужской
    • Награды
Цитировать
Эээээ, нехорошо подсматривать чужой код...
Ты не используешь  фишку ASCII, хотя и вызываешь
Код: AutoIt [Выделить]
$NumArray = StringToASCIIArray($BaseNum)

тут да, согласен, я редиска)))
мне надо было вывести число по порядковому номеру в строке, но я не знаю как из строки вывести отдельный символ((
а тут смотрю - и библиотеки не подключаются, и работает как надо.
в общем плюсую тебе))

ЗЫ:
Цитировать
А потом вместо мудрёного
Код: AutoIt [Выделить]
chr($NumArray[$i])

брать просто
Код: AutoIt [Выделить]
$NumArray[$i]


из
Код: AutoIt [Выделить]
chr($NumArray[$i])

получаю именно число (от 0 до 9)
а из
Код: AutoIt [Выделить]
$NumArray[$i]

получается не число а код числа (0 это 48, 1 это 49 и т. д.)

В общем на что мозгов хватило... :whistle:


Добавлено: Март 12, 2012, 18:07:21
Убрана похожесть на скрипт C2H5OH
(нажмите для показа/скрытия)
« Последнее редактирование: Март 12, 2012, 18:07:21 от xCite, Причина: Объединение сообщений »

Оффлайн winstan [?]

  • Продвинутый
  • ***
  • Сообщений: 406
  • Репутация: 78
  • Пол: Мужской
  • Эксплотатор)
    • Награды
  • Версия AutoIt: 3.3.12.0
(нажмите для показа/скрытия)
« Последнее редактирование: Март 12, 2012, 18:27:44 от winstan »
Помог мой мост? Жми "Полезное сообщение")

я полный "чайник" , но с другой стороный-не пустой.
Каму не трудно кликните по банару(это поднимит мой кирпичек на стене ников)

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4016

  • Автор темы
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Вобщем, все решили правильно. я надеюсь, никто не обидится если за скоростью исполнения признаю победителем нашего этилового друга :)

вот мое решение. отличие от ваших решений - я не использовал конвертацию в ascii, зато использовал богоподобную рекурсию  8)

Код: AutoIt [Выделить]
Func DecToN($decnum, $base)
    Return $base & 'n' & DecToNRec($decnum, $base)
EndFunc

Func DecToNRec($decnum, $base)
    If $decnum < $base Then
        Return $decnum
    Else
        $decint = Floor($decnum/$base)
        $rem = Mod($decnum, $base)
        Return DecToNRec($decint, $base) & $rem
    EndIf
EndFunc

Func NToDec($nnum)
    $nnum = StringSplit($nnum, 'n')
    $base = $nnum[1]
    $nnum = $nnum[2]
    $n = StringLen($nnum)
    $decnum = 0
    For $i = 1 to $n
        $decnum += Int(StringMid($nnum, $i, 1))*$base^($n - $i)
    Next
    Return $decnum
EndFunc

$decnum = 18118
For $i = 2 to 9
    ConsoleWrite($i & ':' & @TAB & DecToN($decnum, $i) & @CRLF)
Next
 


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2706
  • Репутация: 1136
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Код: AutoIt [Выделить]
$re=''
For $i = 2 To 9
    $re &= _DecToN('18118', $i)&@LF
Next
$re=StringTrimRight($re, 1)
MsgBox(0, 'Сообщение', $re)

$aNum=StringSplit($re, @LF)
$re=''
For $i = 1 To $aNum[0]
    $re &= _NToDec($aNum[$i])&@LF
Next
MsgBox(0, 'Сообщение', $re)

Func _DecToN($decnum, $base)
    Local $Out, $ost
    Do
        $ost=Mod($decnum, $base)
        $decnum=($decnum-$ost)/$base
        $Out=$ost&$Out
    Until $decnum=0
    Return $base&'n'&$Out
EndFunc

Func _NToDec($nnum)
    Local $aNum, $i, $n, $Out
    $aNum=StringSplit($nnum, 'n')
    If @error Or Not IsArray($aNum) Or $aNum[0]<>2 Then Return SetError(1)
    $n=StringSplit($aNum[2], '')
    For $i = 1 To $n[0]
        $Out += $n[$i]*$aNum[1]^($n[0]-$i)
    Next
    Return $Out
EndFunc


до шестнадцатеричных
Код: AutoIt [Выделить]
$re=''
For $i = 2 To 16
    $re &= _DecToN('255', $i)&@LF
Next
$re=StringTrimRight($re, 1)
MsgBox(0, 'Сообщение', $re)

$aNum=StringSplit($re, @LF)
; #include <Array.au3>
; _ArrayDisplay($aNum, 'Array')
$re=''
For $i = 1 To $aNum[0]
    $re &= $aNum[$i] & ' - ' & _NToDec($aNum[$i])&@LF
Next
MsgBox(0, 'Сообщение', $re)

Func _DecToN($decnum, $base)
    Local $Out, $ost, $n[16]=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    Do
        $ost=Mod($decnum, $base)
        $decnum=($decnum-$ost)/$base
        $Out=$n[$ost]&$Out
    Until $decnum=0
    Return $base&'n'&$Out
EndFunc

Func _NToDec($nnum)
    Local $aNum, $i, $n, $Out
    $aNum=StringSplit($nnum, 'n')
    If @error Or Not IsArray($aNum) Or $aNum[0]<>2 Then Return SetError(1)
    If StringRegExp($aNum[2], '(?i)[A-F]') Then
        $aNum[2]=StringRegExpReplace($aNum[2], '.', '\0,')
        $aNum[2]=StringTrimRight($aNum[2], 1)
        $aNum[2]=StringReplace($aNum[2], 'A', '10')
        $aNum[2]=StringReplace($aNum[2], 'B', '11')
        $aNum[2]=StringReplace($aNum[2], 'C', '12')
        $aNum[2]=StringReplace($aNum[2], 'D', '13')
        $aNum[2]=StringReplace($aNum[2], 'E', '14')
        $aNum[2]=StringReplace($aNum[2], 'F', '15')
        $n=StringSplit($aNum[2], ',')
    Else
        $n=StringSplit($aNum[2], '')
    EndIf
    For $i = 1 To $n[0]
        $Out += $n[$i]*$aNum[1]^($n[0]-$i)
    Next
    Return $Out
EndFunc

« Последнее редактирование: Март 13, 2012, 02:44:39 от AZJIO »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
5028 Просмотров
Последний ответ Сентябрь 06, 2010, 12:47:57
от amel27
9 Ответов
10780 Просмотров
Последний ответ Март 13, 2012, 12:26:53
от XpycT
20 Ответов
14918 Просмотров
Последний ответ Март 14, 2012, 00:21:18
от Arei
13 Ответов
9153 Просмотров
Последний ответ Декабрь 05, 2012, 19:44:23
от CreatoR
7 Ответов
3023 Просмотров
Последний ответ Март 21, 2014, 19:54:40
от firex
1 Ответов
4709 Просмотров
Последний ответ Сентябрь 10, 2015, 15:40:02
от joiner
20 Ответов
4092 Просмотров
Последний ответ Май 07, 2016, 04:24:56
от AZJIO
3 Ответов
590 Просмотров
Последний ответ Ноябрь 14, 2016, 12:28:51
от Vovsla
7 Ответов
1088 Просмотров
Последний ответ Январь 11, 2017, 00:22:02
от Dessan
7 Ответов
472 Просмотров
Последний ответ Февраль 03, 2017, 21:37:06
от eralex