c - 如何为大整数实现整数数组加法器?

标签 c arrays integer add biginteger

由于 C 不像 JAVA 那样支持大整数,我正在尝试实现一个整数加法器函数,该函数将两个整数数组作为参数并返回指向它们的总和的指针,这也是一个数组。这是我的代码。

#include<stdio.h>
#include<stdlib.h>
int max(int a,int b) {
    return a < b ? b : a;
}

int* decimalAdder (int* p, int* q) {
    int size1, size2, i;
    size1 = sizeof(p) / sizeof(int);
    size2 = sizeof(q) / sizeof(int);
    int m = max(size1, size2) + 1;
    int* c = (int*)malloc(m * sizeof(int));
    int carry = 0;
    for(i=0 ; i<m ; i++) {
        c[i] = 0;
        if(i < size1 && i < size2) {
            c[i] += p[i] + q[i] + carry;
            if(c[i] >= 10) {
                c[i] = c[i] % 10;
                carry = 1;
            }
            else
                carry = 0;
        }
        else if(i < size1) {
            c[i] += p[i] + carry;
            if(c[i] >= 10) {
                c[i] = c[i] % 10;
                carry = 1;
            }
            else
                carry = 0;
        }
        else if(i < size2) {
            c[i] += q[i] + carry;
            if(c[i] >= 10) {
                c[i] = c[i] % 10;
                carry = 1;
            }
            else
                carry = 0;
        }
        else
            c[i] += carry;
    }
    return c;
}

//Test program
int main() {
    int a[] = {7, 5, 3, 6};
    int b[] = {3, 5, 3};
    int* sum;
    int i;
    sum = decimalAdder(a, b);
    int size = sizeof(sum) / sizeof(int);
    for(i = size ; i >= 0 ; i--)
        printf("%d", sum[i]);
    free(sum);
    sum=NULL;
    return 0;
}

它输出 10 我哪里错了?我错过了什么?

最佳答案

如评论中所述,sizeof(p)sizeof(q)sizeof(int *) 相同。您需要将真实的数组大小作为参数传递给 decimalAdder()

因此,首先,更改 decimalAdder() 以接收大小:

int *decimalAdder (int *p, size_t size1, int *q, size_t size2) {
    int i;
    int m = max(size1, size2) + 1;
    int *c = malloc(m * sizeof(int));
    /* ... */
}

您询问如何确定数组的大小以将其传递给 decimalAdder()。好吧,如果您动态分配数组,那么您可能知道大小(它与您之前传递给 malloc(3) 的大小相同)。

如果数组是堆栈分配的(这里就是这种情况),您可以使用在 main() 中使用的 sizeof() 方法,但只能在内部声明数组的函数(因为一旦将局部数组传递给另一个函数,它就会衰减为指向第一个元素的指针,您无法再确定其大小)。

所以在这种情况下,您可以将 main() 更改为:

int main(void) {
    int a[] = {7, 5, 3, 6};
    int b[] = {3, 5, 3};
    size_t size1 = sizeof(a)/sizeof(a[0]);
    size_t size2 = sizeof(b)/sizeof(b[0]);
    int* sum;
    int i;
    sum = decimalAdder(a, size1, b, size2);    
    int size = max(size1, size2);

    for(i = size ; i >= 0 ; i--)
        printf("%d", sum[i]);

    free(sum);
    sum=NULL;

    return 0;
}

请注意 int size = sizeof(sum)/sizeof(int); 不会按您期望的方式工作:sum 不是真正的数组,它是一个指向 int 的指针,所以 sizeof(sum)sizeof(int *) 相同,不是大小你分配的数组。 C 不会跟踪这些,您必须自己做(与 Java 不同)。

关于c - 如何为大整数实现整数数组加法器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32167059/

相关文章:

c - 使用 fscanf 将 float 和字符串存储到 C 结构体数组中

ios - Swift 2 - 使用从 A 到 Z 的键将数组分成字典

Java程序再次运行时弹出错误信息

java - ArrayList <Integer> 与 get/remove 方法

java - 在Java中将3个整数转换为日期变量

c - 编译器如何知道它在数组的末尾?

python - ctypes 上的 PyObject_Str 段错误通过了字典

java - "|"中的 "int style = SWT.APPLICATION_MODAL | SWT.OK;"有什么作用(以及如何用谷歌搜索它)?

iphone - 程序收到信号 "EXC_Bad_Access"NSMutableArray

将大整数转换为 float