Логические задачки (Пощекотать моск...)

Модератор: Модераторы разделов

KukMan
Сообщения: 92
ОС: Kubuntu 7.10

Логические задачки

Сообщение KukMan »

Для начала..

Задача Nhex
Дано число Ch в системе исчисления с основанием m. Написать программу, которая переводит число в систему исчисления с основанкм 10.

Технические условия: Программа читает с клавиатуры в первой сторке число m (2≤m≤16), а следующей - текстовую строку, в которой записано число Ch (0≤Ch≤2+109) . Программа выводит на экран ответ в виде десятичного числа.

Пример:
Ввод:
16
FFFF
Вывод:
65535

Можно заюзать средства языка(если есть такие), но тогда будет в одну строчку. А так, попробуйте построить алгоритм для решения. Исходя из этой задачки, алгоритм для перекодированния числа с основанием m в десятичное число для всех одинаков, только изменяется число m. Жутко интересно...

Можно алгоритм и для "на оборот", т.е. из десятичного в другое представление..
Желательно на Си/Си++
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Логические задачки

Сообщение Denjs »

не.. я не вредный.. но... ...
Желательно на Си/Си++
гм?
Темы от студентов с запросами готовых решений по заданиям зарываются не глядя.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Логические задачки

Сообщение v04bvs »

Код: Выделить всё

#include <iostream>
#include <string>
#include <algorithm>

class processor
{
public:
    processor(int d) : d_(d), r_(0) {}

    void operator()(int n)
    {
        if (n > d_) {
            throw "invalid input";
        }
        r_ = r_ * d_ + n;
    }

    operator int() const
    {
        return r_;
    }

private:
    const int d_;
    int r_;
};

template <class T>
class transformer_
{
public:
    transformer_(T& dest) : dest_(dest) {}

    void operator()(char c)
    {
        if (c >= '0' && c <= '9') {
            dest_(c - '0');
        } else if (c >= 'A' && c <= 'Z') {
            dest_(c - 'A' + 10);
        } else if (c >= 'a' && c <= 'z') {
            dest_(c - 'a' + 10);
        }
    }
private:
    T& dest_;
};

template <class T>
transformer_<T> transformer(T& d)
{
    return transformer_<T>(d);
}

int main(int argc, char* argv[])
{
    int d;
    std::string s;

    std::cin >> d >> s;
    processor p(d);
    std::for_each(s.begin(), s.end(), transformer(p));

    std::cout << static_cast<int>(p) << std::endl;
    return 0;
}
Спасибо сказали: