0

我在创建一个将大数乘以单个数字的递归程序时遇到问题。我知道它们是执行此操作的更简单方法,但我想递归地执行此操作。我在代码中提供了一个 SSCCE。问题是乘法没有正确发生。对于多于 1 位的数字,程序只会乘以最后一位,而不是乘以整个数字。

#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;
}

谢谢你的帮助。

4

2 回答 2

3

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

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

还需要函数multi的自由返回值

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

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

于 2013-06-06T23:47:10.083 回答
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 的问题,但它可能会回答其他人在搜索与该问题类似的内容时可能遇到的问题,所以我将离开它. 如果有人认为这是错误的,请发表评论,如果有必要,我会考虑将其删除。

于 2013-06-06T22:46:02.550 回答