将数字乘以字符串(损坏的大小与 prev_size)
Multiplying numbers as strings (corrupted size vs. prev_size)
我正在挑战代码 war,我必须将两个以字符串形式给出的数字相乘,然后 return 以字符串形式得到结果。
在这里你可以找到挑战:
https://www.codewars.com/kata/multiplying-numbers-as-strings/train/c
所以我已经成功通过了所有示例测试,包括将大数乘以 25 位以上的数字,正如您在网站上看到的那样。
但是当我点击“尝试”按钮时出现此错误:
*** Error in `./test': corrupted size vs. prev_size: 0x0000000001ec9918 ***
======= Backtrace: =========
您可以在下面复制我的代码以查看完整的错误文本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void zero(char *str,int len) //this function fill my *str with 0s;
{
int i = 0;
while (i <= len)
{
str[i] = '0';
i++;
}
}
//and this function below do multiplication that we learned when we were kids
//you can do printf to see how this function work
char *multiply(char *a, char *b) {
int l1 = strlen(a);
int l2 = strlen(b);
int index = l1 + l2;
int new_i = index;
int i = index;
char *total = malloc(index);
char *result = malloc(index);
zero(total,index);
int k = 0;
int add = 0;
int keep;
while (l2 > 0)
{
l1 = strlen(a);
k = 0;
while (l1 > 0)
{
keep = total[i] - '0';
total[i] = ((((total[i] - '0') + (( (b[l2 - 1] - '0') * (a[l1 - 1] - '0') + k ) % 10)) % 10) ) + '0';
add = ( ((keep) + (( (b[l2 - 1] - '0') * (a[l1 - 1] - '0') + k ) % 10)) / 10);
k = (((b[l2 - 1] - '0') * (a[l1 - 1] - '0')) + k) / 10;
if (k > 0 && l1 == 1)
total[i - 1] = k + '0';
if (add > 0)
{
if (total[i - 1] != '9')
total[i - 1] = ((total[i - 1] - '0') + add) + '0';
else
{
total[i - 1] = '0';
total[i - 2] = total[i - 2] + 1;
}
}
i--;
l1--;
}
i = index - 1;
index--;
l2--;
}
i = 0;
while (total[i] == '0') //to avoid coping 0s into result
i++;
if (total[i] == '[=12=]') //in case of (0 * any positive number)
i--;
index = 0;
while (i <= new_i)
{
result[index] = total[i];
i++;
index++;
}
result[index] = '[=12=]';
return result;
}
不知道问题出在哪里,是malloc还是别的?
你的问题看起来像是一个边缘案例,我评论的是 "Corrupted size..." 而不是实际的乘法逻辑。
在 multiply
函数中,我发现了一个问题。您计算的最终答案中的预期字符数为 "index = l1 + l2"。但是,当您执行 "malloc" 时,您必须分配 "index + 1" 字节,这样即使您的输入生成最大可能的答案,您也可以在末尾存储“\0”。
最佳边缘测试用例将使用大数字,“9999...”作为两个输入。
我正在挑战代码 war,我必须将两个以字符串形式给出的数字相乘,然后 return 以字符串形式得到结果。 在这里你可以找到挑战:
https://www.codewars.com/kata/multiplying-numbers-as-strings/train/c
所以我已经成功通过了所有示例测试,包括将大数乘以 25 位以上的数字,正如您在网站上看到的那样。
但是当我点击“尝试”按钮时出现此错误:
*** Error in `./test': corrupted size vs. prev_size: 0x0000000001ec9918 ***
======= Backtrace: =========
您可以在下面复制我的代码以查看完整的错误文本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void zero(char *str,int len) //this function fill my *str with 0s;
{
int i = 0;
while (i <= len)
{
str[i] = '0';
i++;
}
}
//and this function below do multiplication that we learned when we were kids
//you can do printf to see how this function work
char *multiply(char *a, char *b) {
int l1 = strlen(a);
int l2 = strlen(b);
int index = l1 + l2;
int new_i = index;
int i = index;
char *total = malloc(index);
char *result = malloc(index);
zero(total,index);
int k = 0;
int add = 0;
int keep;
while (l2 > 0)
{
l1 = strlen(a);
k = 0;
while (l1 > 0)
{
keep = total[i] - '0';
total[i] = ((((total[i] - '0') + (( (b[l2 - 1] - '0') * (a[l1 - 1] - '0') + k ) % 10)) % 10) ) + '0';
add = ( ((keep) + (( (b[l2 - 1] - '0') * (a[l1 - 1] - '0') + k ) % 10)) / 10);
k = (((b[l2 - 1] - '0') * (a[l1 - 1] - '0')) + k) / 10;
if (k > 0 && l1 == 1)
total[i - 1] = k + '0';
if (add > 0)
{
if (total[i - 1] != '9')
total[i - 1] = ((total[i - 1] - '0') + add) + '0';
else
{
total[i - 1] = '0';
total[i - 2] = total[i - 2] + 1;
}
}
i--;
l1--;
}
i = index - 1;
index--;
l2--;
}
i = 0;
while (total[i] == '0') //to avoid coping 0s into result
i++;
if (total[i] == '[=12=]') //in case of (0 * any positive number)
i--;
index = 0;
while (i <= new_i)
{
result[index] = total[i];
i++;
index++;
}
result[index] = '[=12=]';
return result;
}
不知道问题出在哪里,是malloc还是别的?
你的问题看起来像是一个边缘案例,我评论的是 "Corrupted size..." 而不是实际的乘法逻辑。
在 multiply
函数中,我发现了一个问题。您计算的最终答案中的预期字符数为 "index = l1 + l2"。但是,当您执行 "malloc" 时,您必须分配 "index + 1" 字节,这样即使您的输入生成最大可能的答案,您也可以在末尾存储“\0”。
最佳边缘测试用例将使用大数字,“9999...”作为两个输入。