Преобразование систем счисления 2-16.
Не производится никаких проверок на корректность введённых чисел.
Максимальный размер чисел - те, которые "влезают" в 64 разряда.
Код:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
public slots:
void press_pbtn_01();
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}
Widget::~Widget()
{
delete ui;
}
// перевод числа из х в десятичную систему
QString conv_any_todec(int x, QString str_in)
{
// удаление пробелов из входной строки
str_in = str_in.remove(" ");
QString s1;
quint32 ln = str_in.length() - 1;
quint64 k, sum = 0;
for(quint32 j = 0; j <= ln; j++)
{
s1 = str_in.at(ln - j);
if(s1 == "A") s1 = "10";
if(s1 == "B") s1 = "11";
if(s1 == "C") s1 = "12";
if(s1 == "D") s1 = "13";
if(s1 == "E") s1 = "14";
if(s1 == "F") s1 = "15";
k = 1;
for(quint32 i = 0; i < j; i++) k *= x;
sum += s1.toInt() * k;
}
return QString::number(sum);
}
// перевод числа из десятичной в х систему
QString conv_dec_toany(int x, QString str_in)
{
QString s1, res;
quint32 k;
quint64 dig = str_in.toULongLong();
while(dig > 0)
{
k = dig % x;
dig /= x;
if(k < 10) s1 = QString::number(k);
if(k == 10) s1 = "A";
if(k == 11) s1 = "B";
if(k == 12) s1 = "C";
if(k == 13) s1 = "D";
if(k == 14) s1 = "E";
if(k == 15) s1 = "F";
res += s1;
}
s1.clear();
for(int j = res.length()-1; j >= 0; j--)
{
s1.append(res.at(j));
}
return s1;
}
//функция добавляет пробелы в число 12345678 -> 12 345 678
//---------------------------------------------------------------------------
QString fn_SpsToInt(QString str, quint32 k)
{
int x = str.length() - k;
while(x > 0) {str.insert(x, QString(" ")); x -= k;}
return str;
}
// кнопка "Start"
void Widget::press_pbtn_01()
{
QString str, dec, res;
quint32 chl, k;
str = ui->lineEdit_1->text();
chl = str.toInt();
str = ui->lineEdit_2->text().toUpper();
ui->lineEdit_2->setText(str);
dec = conv_any_todec(chl, str);
str = ui->lineEdit_3->text();
chl = str.toUInt();
if(chl == 10) k = 3;
else k = 4;
res = conv_dec_toany(chl, dec);
ui->label->setText(fn_SpsToInt(dec, 3));
ui->lineEdit_4->setText(fn_SpsToInt(res, k));
}