2013-06-06 2 views
0

У меня возникла проблема с созданием рекурсивной программы, которая умножает большое число на одноразрядное число. Я понимаю, что это простые методы для этого, но я хотел бы сделать это рекурсивно. Я предоставил код SSCCE в коде. Проблема в том, что умножение происходит неправильно. Для чисел с более чем 1 цифрой программа будет умножать только последнюю цифру, а не умножать весь номер.Умножение большого числа на C с помощью одноразрядного числа рекурсивно?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *getmem(int len) { 
    char *ret; 
    ret = malloc(len); 
    if (NULL == ret) { 
    printf("memory allocation failed!\n"); 
    exit (0); 
    } 
    else 
    return ret; 
} 


void printdigs(char *digs) { 
    if('0' == digs[0]) { 
     if (0 == digs[1]){ 
      printf("%s", digs); 
      return; 
     } 
     else printdigs(&digs[1]); 
    } 
    else printf("%s",digs); 

} 


void multi_helper(char *a, char *r, char b, int len, int carry) { 
    int sum; 
    if (-1 == len) { 
     r[0] = (char) (carry + 48); 
     return; 
    } 
    sum = (a[len]-48) * (b-48) +carry; 
    r[len+1] = (char) ((sum % 10) + 48); 
    if (sum > 9) 
     carry = 1; 
    else carry = 0; 
    multi_helper(a,r,'0', len-1,carry); 

} 


char *multi(char *a, char b) { 
    char *res; 
    int l = strlen(a); 
    res = getmem(l + 2); 
    res[l+1] = 0; 
    multi_helper(a, res, b, l-1,0); 
    return res; 
} 


int main(int argc, char *argv[]) { 

    char *n1 = "1000"; 


    printf("%s multiplied by 5 is ", n1); 
    printdigs(multi(n1,"5")); 
    printf("\n"); 


    return 0; 
} 

Спасибо за любую помощь.

+1

В чем проблема? Теоретически это возможно, но вы на самом деле не задавали вопрос. – Chris

+0

Почему вы используете строковые представления чисел? Это часть требований? – xaxxon

+0

Почему вы управляете строками? Почему бы просто не хранить сами цифры и не конвертировать их в конце, когда вы хотите распечатать? – John

ответ

3

printdigs(multi(n1,"5"));

к

printdigs(multi(n1,'5'));

также необходимо свободное возвращаемое значение функции мульти

multi_helper(a,r,'0', len-1,carry);

к

multi_helper(a,r,b, len-1,carry);

2

Я действительно не знаю, что вы ищете (это не использует строки для хранения чисел), но это использует рекурсию для добавления числа к себе определенное количество раз (умножение) с использованием рекурсии для подсчета сколько осталось итераций.

int recursive_multiply(a, b) { 

    if (b==0) { 
    return 0; 
    } 

    char sign = 1; 
    if (b < 0) { 
    sign = -1; 
    b = -b; 
    } 

    return (a + recursive_multiply(a, b-1)) * sign; 

} 

редактировать: с обновлениями на вопрос, то ясно, что это решение не сразу ответить на вопрос Ace имеет, но он может отвечать на вопросы, другие люди могут иметь, когда они ищут что-то похожее на этот вопрос, так Я собираюсь оставить его. Если кто-то думает, что это неправильно, прокомментируйте, и я подумаю об удалении, если это будет оправданно.

Смежные вопросы