Добрый вечер. Нужно выполнить вычитание двух восьмеричных чисел.
Сложение сделала:
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;
}
Может такой вариант поможет... Преобразовать число, сделать операцию, преобразовать назад...
{
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;
}
Может такой вариант поможет... Преобразовать число, сделать операцию, преобразовать назад...
Тупенькая симуляция на 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;
}
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;
}
Антон Полещук
Спасибо большое. Но вы правы, как то я не очень понимаю, как этот код перевести в 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]++;
}
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]++;
}
Похожие вопросы
- Как при восьмеричном коде компьютер понимает сколько знаков (цифр) в числе?
- С++ Арифметические действия над числами пронумерованы следующим образом : 1-сложение, 2-вычитание, 3-умножение, 4-дел...
- перевод чисел в двоичную,восьмеричную системы счисления
- Как перевести числа в двоичную, восьмеричную и шестнадцатиричную? вот эти число помогите)) 312,96?277,76?246,92?
- Используя Правило Счета, запишите первые 20 целых чисел в десятичной, двоичной, троичной, пятеричной и восьмеричной сист
- Представьте число 41 в восьмеричной системесчисления. Укажите оъём алфавита.
- Перевести числа 57 и 13 из десятичной системы счисления в:двоичную, пятеричную, восьмеричную, шестнадцатеричную?
- Перевести число 0,35 из десятичной системы в восьмеричную
- Перевести данное число из 10 системы в "двоичную"восьмеричную"шестнадцатеричную"
- я должен написать прогу на ассемблере для перевода числа из восьмеричной системы в десятичную
strConvToOct("9");
фунция возвращает 1, вместо 11.
Почему?