2016-11-15 8 views
0

Я выполняю задание, которое требует, чтобы я добавил 2 int и потребовал, чтобы я сделал рекурсию. Ниже мой код, но мой вывод всегда на 10 больше, чем на ответ. Зачем? Мой первоначальный перенос является 0.Добавление 2 целых чисел рекурсивно с переносом

int add(int n1,int n2,int carry){ 

    if(n1>0){ 

     if(carry == 1) 
      n1= n1+1; 

     if((n1%10+n2%10)>9) 
      return n1%10 + n2%10 + 10*add(n1/10,n2/10,1); 
     else  
      return n1%10 + n2%10 + 10*add(n1/10,n2/10,0); 

    } 

    else{ 
     return 0; 
    } 
} 
+0

я попытался добавить 999 и 999 результат дал мне 2008 ... каждый раз, когда есть кэрри участие там, кажется, добавление 10 появляясь – Jason

ответ

1

Очевидно, если вы будете следовать вручную вашей программы. Давайте последуем добавить (8, 7, 0):

  • кэрри не 0: ничего не делать
  • n1% 10 + n2% 10 = 15> 9: хорошо, мы будем иметь перенос возвращение 8 + 7 + 10 * add (0, 0, 1)!

Ошибка здесь: вы получаете 25 вместо 15, потому что вы правильно добавляете перенос, но не можете использовать только мод суммы: он должен быть ((8 + 7)% 10) + 10 * add (0, 0, 1)

Так что ваш код должен стать:

... 
if((n1%10+n2%10)>9) { 
    return ((n1%10 + n2%10) % 10) + 10*add(n1/10,n2/10,1); 
} 
else { 
    ... 

Но этот код имеет смысл только для академических целей. Это было бы ужасно в коде реального мира, потому что вы имитируете работу 10 на процессоре с 32 битами (или более) ...

+0

Ах да !! Спасибо!! да это для моих финалов ... – Jason

+0

@Jason. Если это сработает, вы должны принять ответ, чтобы уведомить его о будущих читателях. Так работает SO :-) –

-1

Надеюсь, он вам поможет.

#include <stdio.h>  
int add(int n1,int n2) 
{ 
     if(n2==0) 
       return; 

     int carry = n1&n2; 
     n1 = n1^n2; 
     n2 = carry<<1; 
     add(n1,n2); 
} 
int main() 
{ 
     printf("%d\n",add(29,16)); 
     return 0; 
} 
Смежные вопросы