我无法将123241536287914341
这样的长正数与常数正数(例如2
,3
,... 9
)相乘C使用递归。我了解如何将长正数乘以10
,100
等,因为您只需要在最后添加适当数量的0
。如果使用两个函数乘以2
,3
,4
....,我该怎么做?
即。像
这样的功能char* multi(char *num1, char d)
以及递归辅助函数,例如
void multi_helper(char *a, char *r, char b, int len, int carry)
这是我乘以10
的代码,但格式不同:
char *getmem(int len) {
char *ret;
ret = malloc(len);
if (NULL == ret) {
printf("memory allocation failed!\n");
exit (0);
}
else
return ret;
}
char *shiftleft(char *a) {
char *l = getmem(strlen(a)+2);
strncpy(l,a,strlen(a));
l[strlen(a)] = '0';
l[strlen(a)+1] = 0;
return l;
}
答案 0 :(得分:1)
将您的计数作为参数传递给递归函数。每个级别在传递给下一级之前减去1。在0时,退出递归并返回添加的值。假设您有代码而不是可以添加“大”数字,并且您不会尝试乘以891748917或其他东西(堆栈溢出。)
答案 1 :(得分:0)
这是一些非常匆匆写的草率代码,它执行此操作(在反向字符串上;您可以在调用它之前和之后反转您的数字)。使用相同的方法将您(希望)学习的数字乘以幼儿,这不是 与数字在硬件中的乘积方式不同...
// assumes number is reversed (for example, 100 would be represented as 001)
void mult_string(char *string, int multiplier, int carry)
{
// If at end of number just add the carry digits one by one recursively
if (*string == '\0')
{
if (carry == 0)
return;
unsigned short digit = carry%10;
*string = (char)(digit + '0');
// Will crash if string isn't long enough, you should address that if you actually use this code
string[1] = '\0';
mult_string(string + 1, multiplier, carry/10);
return;
}
// Carry into next multiplication will be the tens digit of the current carry
int newCarry = carry/10;
unsigned short digit = *string - '0';
unsigned short newDigit = digit * multiplier;
// Add tens digit from result of multiplying the digit to carry
newDigit += carry%10;
newCarry += newDigit/10;
newDigit %= 10;
// Write out the multiplied digit
*string = (char)(newDigit + '0');
// Recursively multiply the rest of the string, with carry
mult_string(string + 1, multiplier, newCarry);
}
但是,我建议不要将数字表示为字符串。这是非常低效和不直观的。如果您需要存储和操作任意大数字,那么还有许多其他人已经以更好的方式解决了问题,例如libgmp,bigint等。