我在创建递归程序时遇到问题,该程序将大数字与一位数字相乘。我知道他们这样做的方法比较简单,但我想以递归的方式做到这一点。我在代码中提供了一个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;
}
感谢您的帮助。
答案 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的问题,但它可能会回答其他人在搜索类似问题时可能遇到的问题,所以我要去离开它。如果有人认为这是错误的,请发表评论,如果有必要,我会考虑删除它。