将C中的大数字与递增的单个数字相乘?

时间:2013-06-06 22:41:38

标签: c recursion multiplication

我在创建递归程序时遇到问题,该程序将大数字与一位数字相乘。我知道他们这样做的方法比较简单,但我想以递归的方式做到这一点。我在代码中提供了一个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;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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的问题,但它可能会回答其他人在搜索类似问题时可能遇到的问题,所以我要去离开它。如果有人认为这是错误的,请发表评论,如果有必要,我会考虑删除它。