class Renumeric {
//Полный вариант набора цифр
var $NumSet ='';
//Входящий и исходящий набор цифр
var $InputSet ='';
var $OutputSet ='';
//Буфер временного хранения. Содержит массив целых чисел.
var $Buffer =array();
//Максимальное число в элементе буфера (основание вывода)
var $MaxBufElement =10;
//Код ошибки
/*
*-------------------------------
* 0 - нет ошибки
* 1 - символа нет в наборе
* 2 - символов в наборе больше 1
*-------------------------------
*/
var $Error =0;
/*** Конструктор ***/
function Renumeric(){
$this->NumSet=
'0123456789'. //10
'abcdef'. //16
'ghijklmnopqrstuvwxyz'. //36
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. //62
'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; //128
$this->InputSet =substr($this->NumSet, 0, 16);
$this->OutputSet =substr($this->NumSet, 0, 10);
$this->MaxBufElement=10;
}
/*** Устанавливает входящий и исходящих набор
и оставляет его, пока существует класс ***/
function Preset($InSet, $OutSet){
$this->InputSet=$InSet;
$this->OutputSet=$OutSet;
$this->MaxBufElement=strlen($OutSet);
}
function ADD($n){
$pos=0;
$buf=$n;
do{
if(isset($this->Buffer[$pos])){
$buf+=$this->Buffer[$pos];
}
$this->Buffer[$pos]=$buf % $this->MaxBufElement;
$buf=intval($buf / $this->MaxBufElement);
$pos++;
}while ($buf>0);
}
function MUL($n){
$tmp_buf=array();
$res_len=count($this->Buffer);
if ($res_len==0){
return;
}
$cur_pos=0;
$buf=0;
do{
$a=0;
if ($cur_pos<$res_len){
$a=$this->Buffer[$cur_pos]*$n;
}
$a+=$buf;
$tmp_buf[$cur_pos]=$a % $this->MaxBufElement;
$buf=intval($a / $this->MaxBufElement);
$cur_pos++;
} while(($res_len>$cur_pos)||($buf!=0));
$this->Buffer=$tmp_buf;
}
/*** Переводит из одной системы в другую ***/
function Go($input, $inset=0, $outset=0){
$result=true;
/*** Временное сохранение глобальных наборов ***/
if ($inset!=0 && $outset!=0){
$tmp_in=$this->InputSet;
$tmp_out=$this->OutputSet;
$this->InputSet=substr($this->NumSet, 0, $inset);
$this->OutputSet=substr($this->NumSet, 0, $outset);
$this->MaxBufElement=$outset;
}
/*** Чтение входящего числа ***/
$this->Buffer=array();
$base_in=strlen($this->InputSet);
$count_in=strlen($input);
for ($i=0; $i<$count_in; $i++){
$a=$input[$i];
$present=substr_count($this->InputSet, $a);
if($present==0){
$result=false;
$this->Error=1;
break;
}
if($present>1){
$result=false;
$this->Error=2;
break;
}
if ($i!=0){
$this->MUL($base_in);
}
$this->ADD(strpos($this->InputSet, $a));
}
if ($result){
$result='';
$count_out=count($this->Buffer);
for ($i=0; $i<$count_out; $i++){
$result=$this->OutputSet[$this->Buffer[$i]].$result;
}
}
/*** Восстановление прежних наборов ***/
if (isset($tmp_in)){
$this->InputSet=$tmp_in;
$this->OutputSet=$tmp_out;
$this->MaxBufElement=strlen($tmp_out);
}
return $result;
}
}
Перевод с PHP на С++
Есть задание - в большой проге понадобилось переводить из одной системы исчисления (СИ) в другую, нашел хороший класс, но он на PHP, которого я к сожалению не знаю, если есть добрые переводчики )) помогите пжл, вот код на PHP:
Код:
#include <string>
#include <conio.h>
#include <stdio.h>
#include <vector>
using namespace std;
static const char NumSet[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
class Rebase
{
private:
vector<int> Buffer;
unsigned short int MaxBuf;
unsigned short int Error;
public:
Rebase()
{
Buffer.push_back(0);
MaxBuf = 0;
Error = 0;
}
~Rebase()
{
}
void ADD(unsigned int n)
{
unsigned int pos = 0;
unsigned int buf = n;
do
{
if (Buffer[pos]) buf += Buffer[pos];
Buffer[pos] = buf % MaxBuf;
buf /= MaxBuf;
pos++;
} while (buf>0);
}
void MUL(unsigned int n)
{
unsigned int BufSize = Buffer.size();
if (!BufSize) return;
vector<int> tmpBuffer;
tmpBuffer.clear();
int cur_pos=0;
int buf=0;
do{
int a=0;
if (cur_pos<BufSize)
{
a=Buffer[cur_pos]*n;
}
a+=buf;
tmpBuffer.push_back(a % MaxBuf);
buf=a / MaxBuf;
cur_pos++;
} while((BufSize>cur_pos)||(buf!=0));
Buffer.clear();
for (int k=0; k<Buffer.size(); k++)
Buffer.push_back(tmpBuffer[k]);
}
string * Do(char * input, unsigned int inset=0, unsigned int outset=0)
{
string InputSet="";
string OutputSet="";
for (int in=0; in<inset; in++) InputSet.push_back(NumSet[in]);
for (int out=0; out<outset; out++) OutputSet.push_back(NumSet[out]);
MaxBuf = outset;
unsigned int base_in = InputSet.length();
unsigned int count_in = strlen(input);
for (int inc=0; inc < count_in; inc++)
{
char a = input[inc];
if (inc) MUL(base_in);
ADD((int)(strchr(InputSet.c_str(), a) - InputSet.c_str() + 1));
}
string * res = new string();
res->clear();
int BufSize = Buffer.size();
for (int j=0; j < BufSize; j++)
res->push_back(OutputSet[Buffer[j]]);
return res;
}
};
int main()
{
Rebase r = Rebase();
string * x;
//x = r.Do("3", 10, 4); Error
x = r.Do("3", 10, 5);
printf("%s", x->c_str());
getch();
return 0;
}
#include <conio.h>
#include <stdio.h>
#include <vector>
using namespace std;
static const char NumSet[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
class Rebase
{
private:
vector<int> Buffer;
unsigned short int MaxBuf;
unsigned short int Error;
public:
Rebase()
{
Buffer.push_back(0);
MaxBuf = 0;
Error = 0;
}
~Rebase()
{
}
void ADD(unsigned int n)
{
unsigned int pos = 0;
unsigned int buf = n;
do
{
if (Buffer[pos]) buf += Buffer[pos];
Buffer[pos] = buf % MaxBuf;
buf /= MaxBuf;
pos++;
} while (buf>0);
}
void MUL(unsigned int n)
{
unsigned int BufSize = Buffer.size();
if (!BufSize) return;
vector<int> tmpBuffer;
tmpBuffer.clear();
int cur_pos=0;
int buf=0;
do{
int a=0;
if (cur_pos<BufSize)
{
a=Buffer[cur_pos]*n;
}
a+=buf;
tmpBuffer.push_back(a % MaxBuf);
buf=a / MaxBuf;
cur_pos++;
} while((BufSize>cur_pos)||(buf!=0));
Buffer.clear();
for (int k=0; k<Buffer.size(); k++)
Buffer.push_back(tmpBuffer[k]);
}
string * Do(char * input, unsigned int inset=0, unsigned int outset=0)
{
string InputSet="";
string OutputSet="";
for (int in=0; in<inset; in++) InputSet.push_back(NumSet[in]);
for (int out=0; out<outset; out++) OutputSet.push_back(NumSet[out]);
MaxBuf = outset;
unsigned int base_in = InputSet.length();
unsigned int count_in = strlen(input);
for (int inc=0; inc < count_in; inc++)
{
char a = input[inc];
if (inc) MUL(base_in);
ADD((int)(strchr(InputSet.c_str(), a) - InputSet.c_str() + 1));
}
string * res = new string();
res->clear();
int BufSize = Buffer.size();
for (int j=0; j < BufSize; j++)
res->push_back(OutputSet[Buffer[j]]);
return res;
}
};
int main()
{
Rebase r = Rebase();
string * x;
//x = r.Do("3", 10, 4); Error
x = r.Do("3", 10, 5);
printf("%s", x->c_str());
getch();
return 0;
}
Народ, знающий где ошибка, укажите в чем неточность, пожалуйста...
p.s. К слову сказать этот код легко работает с большими числами, как, например, в теме Перевод HEX -> DEC (которую до решения так и не довели) и будет полезен многим потомкам )))
Тем более, что это ниразу не трудно, стоит только немного разобраться с тем, что такое система счисления, которую вы почему-то называете системой исчисления.
p.s. Я сильно сомневаюсь, что все пишут абсолютно свои алгоритмы - часто полезно изучать и чужие, "мотать на ус"...