1 Востаннє редагувалося Bartash (18.04.2013 17:29:15)

Тема: Цифри різних рахівних систем

Задача виникла в голові у контексті однієї задачки.

Текст завдання

Сабж: необхідно представити певне число десяткової системи у вигляді цифри в іншій рахівній системі.

Уточнення: цифрою вважати символ, який допускається для даної рахівної системи у якості величини на місці розряду ([0-9] для десяткової, [0-9A-F] для 16-ї і т.п.).

Граблі: введене десяткове число не має перевищувати число 10 у результуючій системі (для hex'а це F+1, для oct'а - 7+1, тощо). Можливі рахівні системи у межах задачі: від двійкової до тридцятишісткової.

Таким чином, на вході - число у десятковій системі, на виході ж має бути цифра/літера згідно іншої системи.

Пропоную реалізувати різноманітними мовами (а не тільки профільно-фішковими для кожного з дописувачів).

З.І:

Є думка, що цей підрозділ можна було би винести у Прихований розділ: халявщикам задачі мало цікаві, до того ж вимагають певного бажання та навичок...

UPD:

Для зменшення розмірів повідомлень із рішеннями пропоную наступний формат:

Код

//тут код

Тест

тут картинки з ілюстрацією роботи програми
I belong to the Dead Generation.
Подякували: leofun011

2 Востаннє редагувалося Chemist-i (19.04.2013 14:36:58)

Re: Цифри різних рахівних систем

Pascal/Delphi

// Модуль для роботи з натуральними числами у різних системах зчислення
    
// Далі, якщо говориться, що система числення (СЧ) задається рядком (CharSet)
// то мається на увазі, що ця строка містить символи СЧ, починаючи з нуля
// Приклади CharSet (стандартний вид)   
// Двійкова - '01'   
// вісімкова - '01234567'   
// Десяткова - '0123456789'   
// Шіснадцятков - '0123456789ABCDEF'   
// Можливо використовувати нестандартні види, наприклад для двійкової 'ab', а для
// трійкової 'abc' - даному модулю все одно.
    
// "-ричність" СЧ обмежена тільки наявністю доступних різноманітних символів.
// Робота з чисслами у певній СЧ проводиться як із рядками, тому величина чисел
// майже не має значення, але це погано впливає на продуктивність
// функцій (особливо на множенні)

unit MyUnit;   
    
interface  
    
function Convert(Num, SetIn, SetOut: String): String;   
function MySum (Num1, Num2, CharSet: String): String;   
function MyMulti (Num1, Num2, CharSet: String): String;   
function MyOrd(A: Char; CharSet: String): Integer;   
function MyChr(Num: Integer; CharSet: String): Char;   
    
implementation  
    
// Функція повертає позицію символа А у рядку CharSet (починаючи з 0)
function MyOrd(A: Char; CharSet: String): Integer;   
var  
  i: Integer;   
begin  
  Result := 0;   
  for i := 1 to Length(CharSet) do  
  begin  
    if CharSet[i] = A then begin  
      Result := i-1;   
      exit;   
    end  
  end;   
end;   

//Функція повертає символ із рядка CharSet по номеру Num (~CharSet[Num+1])    
function MyChr(Num: Integer; CharSet: String): Char;   
begin  
  Result := CharSet[Num mod Length(CharSet) + 1];   
end;   

// Функція повертає число без ведущих нулів, тобто ShortNum('0000123')='123'    
function ShortNum(Num, CharSet: String): String;   
var  
  k, j: Integer;   
begin  
  Result := '';   
  k := 1;   
  while Num[k] = MyChr(0, CharSet) do  
    k := k + 1;   
  for j := k to Length(Num) do Result := Result + Num[j];   
end;   

// Функція виконує складання двох числе Num1 та Num2 у СЧ, задіній CharSet     
function MySum (Num1, Num2, CharSet: String): String;   
var  
  i, Pos, Add, L, L_CharSet: Integer;   
  N1 , N2 , O, Res: String;   
begin  
    
  //Далі треба щоб перше число за довжиною було не менше другого,
  //якщо це не так, то міняємо їх місцями
  if Length(Num1)>=Length(Num2) then  
  begin  
    N1 := Num1;   
    N2 := Num2;   
  end  
  else  
  begin  
    N1 := Num2;   
    N2 := Num1;   
  end;   
    
  L:= Length(N1);   
  L_CharSet := Length(CharSet);   
  O:=MyChr(0, CharSet); // 0 - у СЧ, визначаємою CharSet   
  
  //Прирівнюємо друге до довжини першого нулями справа: 10 = 010    
  for i := Length(N2) to L-1 do  
    N2 := O + N2;   
    
  Add:=0;   
    
  //Сумування з молодших розрядів, Add - додаток від попередніх разрядів
  //для слідуючого. Наприклад для 10-вої СЧ: 9+7 - Add = 1, 4+5 - Add=0  
  for i := L downto 1 do  
  begin  
    Pos := MyOrd(N1[i], CharSet)+MyOrd(N2[i], CharSet) + Add;   
    Add := 0;   
    while Pos >= L_CharSet do  
     begin  
     Pos := Pos mod L_CharSet;   
     Add := Add + 1;   
     end;   
    
  Res := MyChr(Pos, CharSet) + Res;   
  end;   
    
If Add<>0  
   then Result := MyChr(Add, CharSet) + Res   
   else Result := Res;   
end;   

// Функція виконує множення двох чисел Num1 та Num2 у СЧ, за визначаємою CharSet    
function MyMulti (Num1, Num2, CharSet: String): String;   
var  
  i, e, Res, N1, N2: String;   
begin  
  N1 := ShortNum(Num1, CharSet);   
  N2 := ShortNum(Num2, CharSet);   
    
  i :='';   
  Res := '';   
  
  //е - одиниця СЧ, що задається CharSet  
  e := MyChr(1,CharSet);   
    
  //Множення Num1 на Num2 - це Num1 додане Num2 разів у СЧ, що задається CharSet
  while (i <> N2) do  
  begin  
    Res := MySum(Res, N1, CharSet);   
    i := MySum(i, e, CharSet);   
  end;   
    
  Result := Res;   
end;   
 
// Функція виконує перетворення одноразрядного числа А, що задане СЧ,
// визначеного SetIn, у число СЧ, визначаємою CharOut 
function f0(A: Char; SetIn, SetOut: String): String;   
var  
  Pos, j, L: Integer;   
  Res: String;   
begin  
  L := Length(SetOut);   
  Pos := MyOrd(A, SetIn);   
    
  for j := 1 To Pos div (L-1) do  
    Res := MySum(Res, MyChr(L-1, SetOut), SetOut);   
    
  Result := MySum(Res, MyChr(Pos mod (L-1), SetOut), SetOut);   
end;   
   
// Функція виконує перетворення числа Num, заданого у СЧ, що визначається SetIn,  
// у число СЧ, що визначається SetOut 
function Convert(Num, SetIn, SetOut: String): String;   
var  
  Base, Multiplier, N, Res: String;   
  i: Integer;   
begin  
  // Num = MultilplierN * Base^N + ... + Multiplier0 * Base^0   
  // Base - основа СЧ, це завжди <останій символ CharSet>+<нульовий символ> ~ 10   
  // MultiplierI - множник при відповідності ступеню
  // Наприклад для 10-вої СЧ - 123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0   
  // Тут Base = 10, Multiplier = {1, 2, 3}   
    
  Base := MySum(f0(MyChr(Length(SetIn)-1, SetIn), SetIn, SetOut), MyChr(1, SetOut), SetOut);   
  N := MyChr(1, SetOut); // = Base^0, потім будемо домножувати на Base (у відповідності до СЧ)   
  Res := '';   
    
  // Обробляємо вхідне число з хвоста   
  for i := Length(Num) downto 1 do  
  begin  
    Multiplier := f0(Num[i], SetIn, SetOut);   
    Res := MySum(Res, MyMulti(Multiplier, N, SetOut), SetOut);   
    N := MyMulti(Base, N, SetOut);   
  end;   
    
  Result := Res;   
end;   
    
end.

Автор: Zoobastik ( http://forum.sources.ru)
Коментарі українською: Chemist-i


Десяткова у шіснадцяткову

function dec2hex(value: dword): string[8];
const
  hexdigit = '0123456789ABCDEF';
begin
  while value != 0 do
  begin
    dec2hex := hexdigit[succ(value and $F)];
    value := value shr 4;
  end;
  if dec2hex = '' then dec2hex := '0';
end;

С/С++

Дуже швидкісний 10 -> 2

void DecToBin (long num,char *bin)
{
   int i,j;
   char tmp[33];

   for (i=0; num; num>>=1, i++)tmp[i] = (num&1)?('1'):('0');
   for (j=0; j<i; j++) bin[j] = tmp[i-j-1];
}

asm

16 -> 2

вхід: AL == перший символ (його код)
      AH == другий символ

вихід: AL == число (байт)

c2byte proc
 sub ax,3030h
 cmp al,9
 jbe @cont1
 sub al,7
@cont1:
 cmp ah,9
 jbe @cont2
 sub ah,7
@cont2:
 xchg ah,al
 shl ah,4
 add al,ah
 ret
c2byte endp

x

3 Востаннє редагувалося Bartash (18.04.2013 23:43:28)

Re: Цифри різних рахівних систем

Chemist-i, мався на увазі загальний алгоритм для переведення у будь-яку з систем указаного діапазону.:)

З.І: та скріншот запуску програми бажано б, а то у мене, скажімо, нема на машині Паскаля. :)

I belong to the Dead Generation.

4 Востаннє редагувалося Chemist-i (18.04.2013 23:53:08)

Re: Цифри різних рахівних систем

Bartash написав:

нема на машині Паскаля.

Так в мене теж нема =)

Шановне товариство, протестіть будь ласка
П.С. Буде трошки більше часу - доведу до розуму

x

5

Re: Цифри різних рахівних систем

Chemist-i написав:

С/С++
Десяткова у шіснадцяткову

function dec2hex(value: dword): string[8];
const
  hexdigit = '0123456789ABCDEF';
begin
  while value != 0 do
  begin
    dec2hex := hexdigit[succ(value and $F)];
    value := value shr 4;
  end;
  if dec2hex = '' then dec2hex := '0';
end;

Якщо це С чи С++, то я гарлемський нєгр :D

Бодай вас Бог любив, а мене – молодиці!
Подякували: Bartash1

6

Re: Цифри різних рахівних систем

Реалізація на С++:

Код

#include <iostream>

#define SYS_MIN        2        //Minimal allowed system
#define SYS_MAX        36        //Maximal allowed system

char convert(int num, int sys=10); /* Prototype of convertation function */
int main() /* Entry point of programme */
{
    /* Test data */
    const int SIZE = 5;
    int    input[SIZE]        = {5,  8, 10, 16, 20},
        systems[SIZE]    = {2, 10, 16, 36, 37};
    
    char c = 0;
    for(int i = 0; i < SIZE; i++)
        if(c=convert(input[i], systems[i]))
            std::cout<<"Number "<<input[i]<<" in DEC equals to "<<c<<" in "<<systems[i]<<"-system\n";
        else
            std::cout<<"Number or system is invalid.\n";
    
    return 0;
}

/* Actually, the function:
    * num - the number in decimal system which should be converted;
    * sys - the destination system which number should be converted to (default - decimal).
    
    Function returns a character (digit or letter) that's valid for 'sys'-system and equals to 'num'.
    If the system is out of allowed range or 'num' cannot be shown in one letter, it returns zero.
 */
char convert(int num, int sys)
{
    if(sys<SYS_MIN || sys>SYS_MAX || num>=sys)
        return 0;
    
    /* Number 48 equals to symbol '0', and 65 to 'A' in ASCII table. */
    return (char)(num<9?(48+num):(65+num-10));
}

Тест

http://radikal.ua/data/upload/0fccf/4fa6c/d0464b31a7.png
I belong to the Dead Generation.

7

Re: Цифри різних рахівних систем

@Batrash
Якщо вам сподобалося програмувати системи числення, то закодьте юнікодом давньослов'янську систему числення з титлом та іншими атрибутами. І щоб годинник був гаджетом на робочому столі :) Повірте, таку роботу в гітхаб не соромно покласти.
http://upload.wikimedia.org/wikipedia/commons/2/24/Kirilica-cifri.jpg

Бодай вас Бог любив, а мене – молодиці!
Подякували: koala, leofun012

8

Re: Цифри різних рахівних систем

Очі.завидющі написав:

@Batrash
Якщо вам сподобалося програмувати системи числення, то закодьте юнікодом давньослов'янську систему числення з титлом та іншими атрибутами. І щоб годинник був гаджетом на робочому столі :) Повірте, таку роботу в гітхаб не соромно покласти.

Там більше геморою з символами, ніж самою програмою.
У даному разі просто задача зацікавила, та особливості втілення алгоритму різними мовами. :)

Хоча, передчуваю, не конче активність буде у цій гілці: багато часу спливло від останньої теми-задачі (від funivan'а) тут...

I belong to the Dead Generation.
Подякували: koala1

9

Re: Цифри різних рахівних систем

Очі.завидющі написав:

Якщо це С чи С++, то я гарлемський нєгр

Перепрошую, виправив

x

10

Re: Цифри різних рахівних систем

Bartash
Мені здається, що тут треба лише правильний юнікодний шрифт знайти.

11 Востаннє редагувалося Q-bart (28.03.2015 18:19:39)

Re: Цифри різних рахівних систем

Мова Python
Писав вже, в процесі навчання Python`a програму для переведення з одної с-ми числення в іншу
Отже, є функція convert_n_to_m
Вона є основною у всій програмі... Дано число x у системі n, його треба перевести в систему m...

Прихований текст

def convert_n_to_m(x, n, m):
    if not(type(x)==int or type(x)==str or type(x)==long) or x<0:
        return False
    if m == 1:
        to_ten = to_tens_sm(x, n)
        result = to_ten * '0'
        return result
    
    x = str(x)
    x = x.upper()
    alhabet_of_num = {"A" : 10, "B" : 11, "C" : 12, "D" : 13, "E" : 14, "F" : 15, "G" : 16,
    "H" : 17, "I" : 18, "J" : 19,"K" : 20, "L" : 21, "M" : 22, "N" : 23, "O" : 24,"P" : 25, "Q" : 26,
    "R" : 27, "S" : 28, "T" : 29,"U" : 30,"V" : 31, "W" : 32, "X" : 33, "Y" : 34, "Z" : 35}
    max_in_1 = max(x)
    default = '-1'
    max_in_2 = alhabet_of_num.get(max_in_1, default)
    if max_in_2 == '-1':
        max_in_2 = max_in_1 
    if max(x) == '0' and n ==10 :
        return 0
    elif n == 10 :
        result = to_any_sm_from_10(x, m)
        return result
    
    
    elif int(max_in_2) >= n:
        return False
    
    
    elif n<>10:
        to_ten = to_tens_sm(x, n)
        if to_ten == 0 :
            return 0
        else:
            result = to_any_sm_from_10(to_ten, m)
            return result

Функція  to_any_sm_from_10 переводить х в десяткову с-му.

Прихований текст

def to_any_sm_from_10(tens_system, any_sm):
    num_of_alhabet = {}
    alhabet_of_num = {"A" : 10, "B" : 11, "C" : 12, "D" : 13, "E" : 14, "F" : 15, "G" : 16,
    "H" : 17, "I" : 18, "J" : 19,"K" : 20, "L" : 21, "M" : 22, "N" : 23, "O" : 24,"P" : 25, "Q" : 26,
    "R" : 27, "S" : 28, "T" : 29,"U" : 30,"V" : 31, "W" : 32, "X" : 33, "Y" : 34, "Z" : 35}
    for key, value in alhabet_of_num.items():
        num_of_alhabet[value] = key
    
    tens_system = int(tens_system)
    m_system = ''
    default = '-1'
    while tens_system != 0:
        ost = tens_system  % any_sm
        ost_for_str = num_of_alhabet.get(ost, default)
        if ost_for_str == '-1' :
            ost_for_str = str(ost)    
        m_system = ost_for_str + m_system
        tens_system = tens_system /any_sm
    return m_system    

А функція  to_any_sm_from_10 переводить з десяткової в систему m

Прихований текст

def to_tens_sm(in_any_sm, sm):
    in_any_sm = str(in_any_sm)
    in_any_sm = in_any_sm.upper()
    default = '-1'
    tens_sm = 0
    counter_of_power = 0
    in_any_sm = in_any_sm[::-1]
    
    alhabet_of_num = {"A" : 10, "B" : 11, "C" : 12, "D" : 13, "E" : 14, "F" : 15, "G" : 16,
    "H" : 17, "I" : 18, "J" : 19,"K" : 20, "L" : 21, "M" : 22, "N" : 23, "O" : 24,"P" : 25, "Q" : 26,
    "R" : 27, "S" : 28, "T" : 29,"U" : 30,"V" : 31, "W" : 32, "X" : 33, "Y" : 34, "Z" : 35}
    
    for char in in_any_sm :
        char_in_numb = alhabet_of_num.get(char, default)
        if char_in_numb == '-1':
            char_in_numb = int(char)
        tens_sm = tens_sm + char_in_numb*(sm**counter_of_power)
        counter_of_power = counter_of_power  + 1
        
    return tens_sm
    

Навчаюсь вчитись, щоб навчатись.
Подякували: 0xDADA11C71

12

Re: Цифри різних рахівних систем

А якщо є готові рішення?:) в PHP

http://php.net/manual/ru/function.base-convert.php

http://php.net/manual/ru/function.bindec.php
http://php.net/manual/ru/function.decbin.php
http://php.net/manual/ru/function.hexdec.php
http://php.net/manual/ru/function.dechex.php
http://php.net/manual/ru/function.octdec.php
http://php.net/manual/ru/function.decoct.php

13

Re: Цифри різних рахівних систем

#include <stdio.h>
#include <stdlib.h>


int _pow(int n, int p) {
    if (n == 0)
        return 1;

    if (n == 1)
        return n;

    int t = 1;
    for (int i = 0; i < p; i++)
        t *= n;

    return t;
}


char *reverse_str(char *b) {
    size_t l = strlen(b);

    for(size_t i = 0; i < l/2; i++) {
        char t = b[l - i - 1];
        b[l - i - 1] = b[i];
        b[i] = t;
    }

    return b;
}


/*
    n - число
    r - система числення
    b - буфер
    c - регістр (якщо r > 10)
*/
char *int_to_char(unsigned int n, int r, char *b, int c) {
    char *t = b;

    if (r < 2 || r > 36)
        return "error!";

    do
        *t++ = n % r + (n % r <= 9 ? '0' : (c ? 'A' : 'a') - 10);
    while(n /= r);

    *t = '\0';

    return reverse_str(b);
}


/*
    b - число у вигляді строки
    r - система числення 
*/
int char_to_int(char *b, int r) {
    int t = 0;
    int p = strlen(b) - 1;
    int sign = 0;

    if (r < 2 || r > 36)
        return t;

    if(*b == '-') {
        b++;
        p--;
        sign = 1;
    }

    while(*b) {
        t += (*b - (*b - '0' <= 9 ? '0' : (*b <= 'Z' && *b >= 'A' ? 'A' : 'a') - 10)) * _pow(r, p--);
        b++;
    }

    return sign ? -t : t;
}


int main() {
    char buf[100];

    printf("int_to_char(): %s\n", int_to_char(0xAAAAAAAA, 2, buf, 0));
    printf("int_to_char(): %s\n", int_to_char(1234567890, 10, buf, 0));
    printf("int_to_char(): %s\n", int_to_char(0xABCDEF12, 16, buf, 1));
    printf("int_to_char(): %s\n\n", int_to_char(0xABCDEF12, 16, buf, 0));

    printf("char_to_int(): %X\n", char_to_int("10101010101010101010101010101010", 2));
    printf("char_to_int(): %d\n", char_to_int("1234567890", 10));
    printf("char_to_int(): %X\n", char_to_int("ABCDEF12", 16));
    printf("char_to_int(): %X\n", char_to_int("1BCQPBE", 36));
    printf("char_to_int(): %X\n", char_to_int("-1234567890", 10));
    printf("char_to_int(): %d\n", char_to_int("B669FD2E", 16));


    return 0;
}

int_to_char(): 10101010101010101010101010101010
int_to_char(): 1234567890
int_to_char(): ABCDEF12
int_to_char(): abcdef12

char_to_int(): AAAAAAAA
char_to_int(): 1234567890
char_to_int(): ABCDEF12
char_to_int(): AAAAAAAA
char_to_int(): B669FD2E
char_to_int(): -1234567890

Подякували: 0xDADA11C7, leofun012

14

Re: Цифри різних рахівних систем

CGI-конвертер в старослов'янські цифри на sed

#!sed minimal.txt - -f
s/[^0-9]//g
s/^/0000000000/
s/.*\(..........$\)/\1/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)$/J\1I\2H\3G\4F\5E\6D\7C\8B\9A/
s/0[A-J]//g
s/1B\(..\)/\11B/
s/\(^[0-9][ABC]\)/\1\~/
s/\([D-J][0-9][ABC]\)/\1~/
s/\([D-J]\)/A\1/g
s/\(..\)D/t\1/
s/1A/а/g
s/2A/в/g
s/3A/г/g
s/4A/д/g
s/5A/е/g
s/6A/ѕ/g
s/7A/з/g
s/8A/и/g
s/9A/э/g
s/1B/і/g
s/2B/к/g
s/3B/л/g
s/4B/м/g
s/5B/н/g
s/6B/ж/g
s/7B/о/g
s/8B/п/g
s/9B/ч/g
s/1C/р/g
s/2C/с/g
s/3C/т/g
s/4C/у/g
s/5C/ф/g
s/6C/х/g
s/7C/щ/g
s/8C/ю/g
s/9C/ц/g
#s/.[E-J]/ \0/g
#s/E/E /g
s!t!<sub>\&#1154;</sub>!g
s/.[E-J]/\0\&thinsp;/g
s/&thinsp;<sub>/<sub>/g
s/э/\&#1139;/g
s/ж/\&#1135;/g
s/щ/\&#1137;/g
s/у/\&#1141;/g
s/ю/\&#1121;/g
s/~/\&#1155;/g
s/E/\&#8413;/g
s/F/\&#1160;/g
s/G/\&#1161;/g
s/H/\&#42608;/g
s/I/\&#42609;/g
s/J/\&#42610;/g
s/^/<br>/
1i\
Content-type: text/html; charset=cp1251\
\
<form method=POST enctype=text/plain><textarea name=numbers> </textarea><br><input type=submit></form>\
<font face=universalia size=6>

Допоміжний файл minimal.txt містить один перехід на новий рядок.

py -3 -m pip install git+https://github.com/snoack/python-goto
Подякували: 0xDADA11C71

15 Востаннє редагувалося Kane (28.03.2015 21:23:14)

Re: Цифри різних рахівних систем

Те саме що й вище, але на Пайтоні.

def int_to_str(n, r, c):
    sign = 0
    l = []

    if r < 2 or r > 36:
        return 'null'

    if n < 0:
        n = -n
        sign += 1

    while True:
        t = n % r
        l.append(chr(t + ((ord(('a', 'A')[c]) - 10, ord('0'))[t <= 9])))

        n //= r
        if n == 0:
            break

    if sign == 1:
        l.append('-')

    return ''.join(l)[::-1]


def str_to_int(s, r):
    t, sign = 0, 0
    p = len(s)-1

    if r < 2 or r > 36:
        return t

    if s[0] == '-':
        sign += 1
        p -= 1

    for i in range(sign, len(s)):
        t += (ord(s[i]) - ((ord(('a', 'A')[s[i].isupper()]) - 10, ord('0'))[s[i].isdecimal()])) * r**p
        p -= 1

    return (-t, t)[sign == 0]


its = [
    (0xABCDEF12, 2, False),
    (1234567890, 10, False),
    (0xABCDEF12, 16, True),
    (0xABCDEF12, 16, False),
    (1234567890, 36, True),
    (-0x543210EE, 16, True),
    (str_to_int('abcdef12', 27), 27, True)
]

sti = [
    ('01001001100101100000001011010010', 2),
    ('1234567890', 10),
    ('499602D2', 16),
    ('KF12OI', 36),
    ('kf12oi', 36),
    ('-543210EE', 16),
    (int_to_str(1234567890, 31, False), 31)
]

for i_its in range(len(its)):
    print('int_to_str(): %s' % int_to_str(its[i_its][0], its[i_its][1], its[i_its][2]))

print()

for i_sti in range(len(sti)):
    print('str_to_int(): %d' % str_to_int(sti[i_sti][0], sti[i_sti][1]))

int_to_str(): 10101011110011011110111100010010
int_to_str(): 1234567890
int_to_str(): ABCDEF12
int_to_str(): abcdef12
int_to_str(): KF12OI
int_to_str(): -543210EE
int_to_str(): ABCDEF12

str_to_int(): 1234567890
str_to_int(): 1234567890
str_to_int(): 1234567890
str_to_int(): 1234567890
str_to_int(): 1234567890
str_to_int(): -1412567278
str_to_int(): 1234567890

Подякували: 0xDADA11C7, leofun012

16

Re: Цифри різних рахівних систем

На JavaScript

function convInt(num, sys) {
  return num.toString(sys);
}

//параметр num - число для конвертування
//sys - номер рахівної системи

document.write(convInt(1234,2)); //вивід

17

Re: Цифри різних рахівних систем

print(int('0xabcdef12', 16))

А сенс? :D

18 Востаннє редагувалося VTrim (10.04.2015 09:36:07)

Re: Цифри різних рахівних систем

PHP
З двійкової в десяткову.

 $bin = '10100';

 $l = strlen($bin);

 $j = strlen($bin);

 for($i=0; $i<$l; ++$i) {

 --$j;

 $res += $bin[$i] * pow(2, $j);

 }

 print $res;

З десяткової в двійкову

   $dec = 50;
 
   for($i=0; $dec; $dec>>=1, ++$i) $bn[] = $dec & 1;

   for($j=0; $j<$i; ++$j) $bin .= $bn[$i-$j-1];

   print $bin;

19 Востаннє редагувалося P.Y. (07.09.2015 01:54:56)

Re: Цифри різних рахівних систем

Конвертер з римських цифр (з розширеними правилами: дозволяється розміщувати цифри в будь-якому порядку, при цьому цифра вважається від'ємною, якщо після неї є хоч одна більша за неї цифра, інакше — додатньою. Наприклад, 95 можна записати як XCV, VC, LVL, VICI та ін.).

Мова — Сі, може також запускатися як батник, що запускає gcc для своєї компіляції.

rem /*
@echo off
::type "%~f0"
gcc -xc  "%~f0" -o "%~dpn0.exe"
"%~dpn0.exe" %*
pause
goto :eof
*/ (){}

#include <stdio.h>

static int digmap[256];

int fromxroman(char *s)
    {    
    int dig, maxdig=0, sum=0;
    char *p;
    for(p=s; *p!='\0'; p++);
    for(p--; p>=s; p--)
        {
        dig=digmap[*p];
        if(dig>=maxdig)
            {
            maxdig=dig;
            sum+=dig;
            }
        else    sum-=dig;
        }
    return sum;
    }

int dignumbers(int n, int *digvals, int *res, int bestlen)
    {
    //знайти  два найближчі числа до даного, що відрізняються на значення digvals[0]
    if (*digvals==0)
        return bestlen;
    int current= n / *digvals;
    int rest=    n % *digvals;
    if(rest<0)
        {
        rest += *digvals;
        current--;
        }
    if(abs(current)>=bestlen) 
        {
        return bestlen;
        }
    if(rest==0)
        {
        *res=current;
        while(*(++digvals)!=0)
            *(++res)=0;
        return abs(current);
        }
    else    {
        int oldlen=bestlen;
        bestlen=dignumbers(rest,            digvals+1, res+1, bestlen-abs(current)  )+abs(current);
        if(bestlen<oldlen)
            *res=current;
        oldlen=bestlen;
        bestlen=dignumbers(rest - *digvals, digvals+1, res+1, bestlen-abs(current+1))+abs(current+1);
        if(bestlen<oldlen)
            *res=current+1;
        return bestlen;
        }
    }
    
static char digits[]="MDCLXVI";
static int digvals[]={1000,500,100,50,10,5,1,0};
char* toxroman(int n, char* res)
    {
    char* res0=res;
    int digres[9];
    dignumbers(n,digvals,digres,1000);
    int i, j;
    //for(i=0;digvals[i]>0;i++)printf("%d ", digres[i]);printf("\n");
    for (i=0;digvals[i]>0;i++)
        if(digres[i]>=1)
            {
            for(; digres[i]>1; digres[i]--)
                *(res++)=digits[i];            
            //дописати від'ємні цифри:
            for(j=i+1; digvals[j]>0 && digres[j]<1; j++)
                for(; digres[j]<0; digres[j]++)
                    *(res++)=digits[j];
            if(digres[i]==1)
                *(res++)=digits[i];
            }
    *(res++)='\0';
    return res0;
    }

main()
{
char bfr[256], s[256];
char *p;
int offset,n,m;
for(p="IVXLCDM", n=1, m=5; *p!='\0'; p++, n*=m, m^=7)
    digmap[*p]=digmap[*p+'a'-'A']=n;
while(gets(bfr))
    for(offset=0; sscanf(&bfr[offset], "%s%n", s, &n)==1;offset+=n)
        {
        if(s[0]=='.') //
return;//<------------------//
        if(s[0]>='0' && s[0]<='9')
            {
            int n=atoi(s);
            printf("%s = %d\n", toxroman(n, s), n);
            }
        else    printf("%s = %d\n", s, fromxroman(s));
        }
}

P.S. Оновлена версія, що здійснює конвертування в обох напрямках. При перетворенні з арабських в розширені римські, підбирає найкоротшу можливу комбінацію, що відповідає вказаним вище правилам. Напр., 1996 записується не MCMXCVI (що відповідає традиційному римському запису), а MVMI (те ж значення, але всього чотирма знаками).

py -3 -m pip install git+https://github.com/snoack/python-goto

20

Re: Цифри різних рахівних систем

Конвертер для запису числа китайськими ієрогліфами. Використав гаскель, який поки що для мене все ще китайська грамота. Втім, як і сама китайська грамота.

module Main where

pow :: Integer -> Integer -> Integer
pow x 0 = 1
pow x 1 = x
pow x n = (pow x (n-1))*x

toChinese :: Integer -> String
toChinese 0 = "零" -- або "〇"
toChinese 1 = "一"
toChinese 2 = "二"
toChinese 3 = "三"
toChinese 4 = "四"
toChinese 5 = "五"
toChinese 6 = "六"
toChinese 7 = "七"
toChinese 8 = "八"
toChinese 9 = "九"
toChinese x
 |x>=(10000`pow`11) = toChinese2(x, (10000`pow`11),"载")
 |x>=(10000`pow`10) = toChinese2(x, (10000`pow`10),"正")
 |x>=(10000`pow`9)  = toChinese2(x, (10000`pow`9), "涧")
 |x>=(10000`pow`8)  = toChinese2(x, (10000`pow`8), "沟")
 |x>=(10000`pow`7)  = toChinese2(x, (10000`pow`7), "穰")
 |x>=(10000`pow`6)  = toChinese2(x, (10000`pow`6), "秭")
 |x>=(10000`pow`5)  = toChinese2(x, (10000`pow`5), "垓")
 |x>=(10000`pow`4)  = toChinese2(x, (10000`pow`4), "京")
 |x>=(10000`pow`3)  = toChinese2(x, (10000`pow`3), "兆")
 |x>=(10000`pow`2)  = toChinese2(x, (10000`pow`2), "亿")
 |x>=10000 = toChinese2(x, 10000, "万")
 |x>=1000  = toChinese2(x, 1000,  "千")
 |x>=100   = toChinese2(x, 100,   "百")
 |x>=10    = toChinese2(x, 10,    "十")
 
toChinese2 :: (Integer, Integer, String) -> String
toChinese2 (x, n, symb)
 |x `mod` n == 0                    = toChinese(x `div` n) ++ symb
 |x `mod` n `div` (n `div` 10) == 0 = toChinese(x `div` n) ++ symb ++ "零" ++ toChinese(x `mod` n)
 |otherwise                         = toChinese(x `div` n) ++ symb ++ toChinese(x `mod` n)

main = do
    x<-getLine
    putStrLn(toChinese(read x :: Integer))
py -3 -m pip install git+https://github.com/snoack/python-goto
Подякували: quez, 0xDADA11C72