2015-12-18 7 views
-1

Я пытаюсь добавить два восьмеричных числа, добавив соответствующие цифры, но я застрял, когда дело в том, что сумма цифр больше 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 
} 
+3

Вы можете использовать 'a + b' и использовать' std :: oct' для ввода/вывода, но это было бы слишком просто. Нет никакой разницы между восьмеричным/десятичным/шестнадцатеричным 'int'. Это всегда двоично, это то, как вы его читаете/печатаете. – LogicStuff

+0

Как вы представляете "восьмеричные" числа? –

+0

@Abhilash Создание 'int' представляет восьмеричное значение после того, как оно напечатано как десятичное, просто безумие. – LogicStuff

ответ

2

Вот функция, которую я сделал. Важно помнить о переносе. Потому что, если ваши номера будут длиннее (например: 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; 
} 

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

3

Поскольку вы передаете int с, я предполагаю, что вы используете десятичные кодированные значения в восьмиричном *, т.е. десятичных чисел, которые используют только цифры от 0 до 7 включительно. Например, номер 123 , который на самом деле 83 будет закодированы как 123 используя свою схему.

  • Принятие решения о состоянии остановки - вы хотите, чтобы ваш 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.

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

+0

Perfect. +1 для правильной интерпретации и для того, чтобы научить меня терминам десятичных кодов –

+1

@Abhilashk. Если честно, я придумал термин на месте по аналогии с двоично-кодированными десятичными знаками. Идея в обоих случаях точно такая же; единственная разница - это пара оснований (8 и 10 в вашем случае против 10 и 16 в BCD). – dasblinkenlight

+0

попробуйте 20 и 62 и введите функцию, что-то не так –