【发布时间】:2019-05-20 23:41:21
【问题描述】:
以下 C 程序将大数乘以字符串。它适用于正数,但使用大量内存时会使用太多内存。如何改进它以使用更少的内存?
我的程序:
char *strrev(char *str) {
char *p1, *p2;
if(!str || !*str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) {
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
char* addNumbers(char* c1, char* c2) {
char *m1;
char *m2;
if (strlen(c1) >= strlen(c2)) {
m1 = malloc(sizeof(c1));
m2 = malloc(sizeof(c2));
strcpy(m1, c1);
strcpy(m2, c2);
} else {
m1 = malloc(sizeof(c2));
m2 = malloc(sizeof(c1));
strcpy(m1, c2);
strcpy(m2, c1);
}
strrev(m1);
strrev(m2);
int lm1 = strlen(m1);
int lm2 = strlen(m2);
//char *w = malloc(1000000);
char its;
int jd = 0;
for (int l = 0; l < lm1; l++) {
int w1 = strToInt(m1[l]);
int w2;
if (l < strlen(m2)) {
w2 = strToInt(m2[l]);
} else {
w2 = 0;
}
int w3 = w1 + w2 + jd;
if (w3 > 9) {
jd = 1;
w3 = w3 % 10;
} else {
jd = 0;
}
its = w3 + 48;
m1[l] = its;
}
if (jd > 0) {
char its2[12];
sprintf(its2, "%d", jd);
strcat(m1, its2);
}
return strrev(m1);
}
int main(int argc, char* argv[]) {
char *c1;
char *c2;
if (strlen(argv[1]) > strlen(argv[2])) {
c1 = malloc(sizeof(argv[1]));
c2 = malloc(sizeof(argv[2]));
strcpy(c1, argv[1]);
strcpy(c2, argv[2]);
} else {
c1 = malloc(sizeof(argv[2]));
c2 = malloc(sizeof(argv[1]));
strcpy(c1, argv[2]);
strcpy(c2, argv[1]);
}
char counter[sizeof(c2)];
sprintf(counter, "%d", 0);
char one[2];
sprintf(one, "%d", 1);
char *w = malloc(100);
while (strcmp(counter, c2) != 0) {
strcpy(counter, addNumbers(counter, one));
strcpy(w, addNumbers(w, c1));
}
printf("%s\n%s\n", c1, c2);
free(c1);
free(c2);
printf("Result: %s,%ld\n\n", w,sizeof(w));
free(w);
}
我知道存在更好的算法,但我必须使用addNumbers() 函数。
【问题讨论】:
-
请正确格式化您的问题。
-
sizeof pointer_char==>strlen(pointer_char) + 1;你有几个要改变 -
至少有一个大问题:
sizeof(c1)不是字符串的长度。使用strlen。阅读 C 教科书中处理字符串的章节。 -
您可以查看 GMP(GNU 多精度库)。 gmplib.org/ 将大整数存储为二进制,这(a)更紧凑,(b)计算速度更快,
-
BTW 现在不鼓励使用 XOR 交换值。使用临时变量。