Добавить два восьмеричных числа напрямую без преобразования в десятичную

Я пытаюсь добавить два восьмеричных числа, добавляя соответствующие цифры, но я застреваю, когда дело в том, что сумма цифр больше 7. Мне нужно взять с собой перенос и добавить его в следующий цикл добавления , Я не могу найти правильное выражение, чтобы рассмотреть перенос и вычислить окончательную сумму.

Другой случай для рассмотрения, когда восьмеричные числа а также б не имеют одинаковое количество цифр, например: 6 и 13 (6 + 13 = 21 в восьмеричный). Я не могу установить условие для цикла while для такого условия (если у обоих одинаковое количество цифр, я могу запустить цикл while до тех пор, пока один из них или оба не станут равными нулю)

Может кто-нибудь, пожалуйста, помогите / заполните следующий код:

int octal_sum(int a,int b)     //a and b and octal numbers
{
int sum=0,carry=0,d=0;
while(**???**)
{
d=0;
d=carry+(a%10)+(b%10);
a/=10;b/=10;
if(d>7)
{
carry=1;
d=d%8;
}
sum= **???**
}
return sum;     //returns octal sum of a and b
}

-1

Решение

Вот функция, которую я сделал. Важно помнить о переносе. Потому что, если ваши номера сложатся длиннее (например, 7777 + 14 = 10013), если вы проигнорируете перенос, код вернет только четыре цифры (ваша самая длинная длина номера), поэтому 0013, что равно 13. Не хорошо. Таким образом, мы должны учитывать перенос. Мы должны продолжить наш цикл, пока оба наших числа а также Керри все 0.

Дальше больше, если цифру получаешь путем расчета a%10 + b%10 + carry меньше 8, то нам больше не нужно переносить, поэтому нам нужно сбросить значение.

Обратите внимание, что я использую целое число ранга цифры, которое в основном позволяет мне добавить цифру к началу суммы, умножив ее на степени десяти, а затем добавив ее к сумме.

Окончательный код выглядит следующим образом.

int octal_sum(int a, int b)
{
int sum = 0, digit = 0, carry = 0, digit_rank = 1;

// Calculate the sum
while (a > 0 || b > 0 || carry)
{
// Calculate the digit
digit = a % 10 + b % 10 + carry;

// Determine if you should carry or not
if (digit > 7)
{
carry = 1;
digit %= 8;
}
else
carry = 0;

// Add the digit at the beggining of the sum
sum += digit * digit_rank;
digit_rank *= 10;

// Get rid of the digits of a and b we used
a /= 10;
b /= 10;
}
return sum;
}

Надеюсь, это помогло вам!

2

Другие решения

Так как вы проходите ints, я предполагаю, что вы используете восьмеричные десятичные коды*, то есть десятичные числа, которые используют только цифры от 0 до 7 включительно. Например, номер 1238 что на самом деле 8310 было бы закодированный как 12310 используя вашу схему.

  • Определение условия остановки — ты хочешь свой while цикл, чтобы продолжить, пока оба числа a, b, а также carry повернуть ноль. Другими словами, условие должно быть a || b || carry
  • Добавление следующей цифры к сумме — так как результат закодирован как десятичный, вам нужно умножить цифру d следующей последовательной силой десяти. Простой способ сделать это — добавить новую переменную. m который начинается в 1 и умножается на десять на каждую итерацию.

Результат будет выглядеть так:

int octal_sum(int a,int b) {
int sum=0, carry=0, d=0, m = 1;
while(a || b || carry) {
d=0;
d=carry+(a%10)+(b%10);
a/=10;b/=10;
if(d>7) {
carry=1;
d=d%8;
} else {
carry = 0;
}
sum += d*m;
m *= 10;
}
return sum;     //returns octal sum of a and b
}

Demo.

* Это будет похоже на двоично-десятичный (BCD) представление, когда представление, способное хранить шестнадцатеричные цифры, используется для хранения десятичных цифр.

3

По вопросам рекламы [email protected]