Другие языки программирования и технологии

Вычитание восьмеричных чисел

Добрый вечер. Нужно выполнить вычитание двух восьмеричных чисел.
Сложение сделала:
function Add(a,b)
{
a=parseInt(a);
b=parseInt(b);

var sum=0, carry=0, d=0, m = 1;
while(a|| b|| carry)
{
d=0;
d=carry+(a%10)+(b%10);
d=Math.floor(d);
//alert(d);
a/=10;
a=Math.floor(a);
b/=10;
b=Math.floor(b);
if(d>7) {
carry=1;
d=d%8;
d=Math.floor(d);
} else {
carry = 0;
}
sum += d*m;
m *= 10;
}

text.value=sum;
//alert(sum);
}
А вот с вычитанием чисел возникли проблемы. Подскажите, пожалуйста, алгоритм вычитания либо код на любом языке программирования.
int strConvToOct(const char *oct_str) //преобразование восьмиричной строки в число типа int
{
int temp = 0, i = 0;
while(oct_str[i])
{
temp <<= 3;
temp |= (oct_str[i] - 48 & 7); // символ минус 48 получаем число например символ "7" - 48 = 7
i++; //побитовое & 7 только для того, что бы обрубить все что больше семи
}
return temp;
}

void intConvToOctStr(int num, char *str) //преобразование числа в восьмиричную строку
{
char temp[10] = {0};
int i = -1;
while(num)
{
temp[++i] = (num & 7) + 48; // число преобразуем в символ. Так как последнее число пишем вначало массива
num >>= 3; // то далее придется переворачивать массив

}

for (int j = 0 ; j<=i; j++)
{
str[j] = temp[i-j]; //Строку переворачиваем, потому что писали задом на перед
}
str[i+1] = 0;
}

Может такой вариант поможет... Преобразовать число, сделать операцию, преобразовать назад...
L6
Lioha 64
15 398
Лучший ответ
Антон Полещук Спасибо, вы подсказали хорошую идею! Скажите еще такое, я когда передаю в функцию 9 или 8:
strConvToOct("9");
фунция возвращает 1, вместо 11.
Почему?
Тупенькая симуляция на C#. Как ты будешь это переводить на свой жабоскрипт (или что это у тебя такое, нестрого типизированное?) - я не очень представляю. Обрати внимание на метод MakeMove - я что-то подзабыл, как правильно делать заемы, потестируй это дело, возможно, я там немного напортачил.

static void XChange(ref uint a, ref uint b)
{
uint c = a;
a = b;
b = c;
}

static string AddLeading0(string a, int n)
{
while (a.Length < n)
a = "0" + a;
return a;
}

static void MakeMove(ref int[] a, int n)
{
int i = n - 1;
while (a[i] == 0)
i--;
a[i]--;
for (int k = i + 1; k <= n; k++)
a[k] += 8;
}

static int Subtract8(uint a, uint b)
{
bool XchangeNeeded = b > a;
if (XchangeNeeded)
XChange(ref a, ref b);

string sa = a.ToString();
string sb = b.ToString();

sb = AddLeading0(sb, sa.Length);

int[] aa = sa.ToCharArray().Select(x => int.Parse(x.ToString())).ToArray();
int[] bb = sb.ToCharArray().Select(x => int.Parse(x.ToString())).ToArray();
int[] rr = new int[aa.Length];

for (int i = aa.Length - 1; i >= 0; i--)
{
if (aa[i] < bb[i])
MakeMove(ref aa, i);
rr[i] = aa[i] - bb[i];
}

int Result = 0;

for (int i = 0; i < rr.Length; i++)
Result = Result * 10 + rr[i];

if (XchangeNeeded)
Result = -Result;

return Result;

}
КС
Киря С Химов
88 363
Антон Полещук Спасибо большое. Но вы правы, как то я не очень понимаю, как этот код перевести в javascript
Киря С Химов Правильный MakeMove:

static void MakeMove(ref int[] a, int n)
{
int i = n - 1;
while (a[i] == 0)
i--;
a[i]--;
for (int k = i + 1; k <= n; k++)
a[k] += 7;
a[n]++;
}

Похожие вопросы