C语言高精度计算,两个1000位以内的正整数相加,以下的程序是我在网上找到的,求大神解答每一行编码意思

2025-04-04 08:29:10
推荐回答(4个)
回答1:

其实它大概的思路如下:

  1. 计算出两个大数的长度,并记录最大长度

  2. 在共同长度内进行计算,分为进位和不进位两种情况

  3. 根据长度较大的大数长出的部分粘到结果,再根据进位情况调整

  4. 输出结果

其实个人觉得他的思路虽然没有错,但不够清晰,可以进行一定的改进

#include 
int main() {

    char addend1[1001] = {0};
    char addend2[1001] = {0};
    char result[1001] = {0};
    int length1, length2, resultLength;
    int carryOver = 0;
    int i, mark;
    printf("请输入第一个加数");
    scanf("%s", &addend1);
    printf("请输入第二个加数");
    scanf("%s", &addend2);
    for (length1 = 0; addend1[length1]; length1++); // 注意是以分号结尾,求出第一个数的长度
    length1--;  // 因为后面是计算到length1-1,所以要减1
    for (length2 = 0; addend2[length2]; length2++); // 求出第二个数的长度
    length2--;
    resultLength = length1 > length2 ? length1 : length2;   // 记录最大长度
    for (i = 0; i <= resultLength; i++) {   // 在最大长度内进行计算
        if((i <= length1) && (i <= length2)) {  // 如果两个数在这个位置都有数
            result[resultLength - i] = addend1[length1 - i] - '0' + addend2[length2 - i] + carryOver;   // 计算该位的值,为两个加数的值之和再加上进位
            if(result[resultLength - i] > '9') {    // 如果需要进位
                carryOver = 1;  // 标记有进位,且为1
                result[resultLength - i] -= 10; // 减去进1位所需要的10
            } else {
                carryOver = 0;  // 标记无进位
            }
        } else {    // 如果两个数最多只有一个数在这个位置有值,则退出循环
            break;
        }
    }
    mark = i;   // 记录一个数比另一个数多出的开始位置
    if (i <= length1) { // 如果是第一个数多出的话,那根据第一个数多出的部分计算
        while (i <= length1) {
            result[resultLength - i] = addend1[length1 - i];
            i++;
        }
    }
    if (i <= length2) {     // 如果是第二个数的话,则根据第二个数计算
        while (i <= length2) {
            result[resultLength - i] = addend2[length2 - i];
            i++;
        }
    }
    for(i = mark; carryOver; i++) { // 如果在多出的位置有进位的话,则根据进位一步一步向前进位,直至没有进位为止
        result[resultLength - i] += 1;

        if (result[resultLength - i] > '9') {
            result[resultLength - i] -= 10;
        } else {
            if (i > resultLength) {
                printf("1");
            }
            break;
        }
    }
    for (i = 0; i <= resultLength; i++) {   // 输出结果
        if (result[i]) {
            printf("%c", result[i]);
        }
    }
    return 0;
}

欢迎追问,满意请采纳,谢谢

回答2:

其实它大概的思路如下:
计算出两个大数的长度,并记录最大长度
在共同长度内进行计算,分为进位和不进位两种情况
根据长度较大的大数长出的部分粘到结果,再根据进位情况调整
输出结果
其实个人觉得他的思路虽然没有错,但不够清晰,可以进行一定的改进

回答3:

for(i=0;i0;i--){if(c[0]==c[i])break;elsecontinue;}其次这里,你是想判断改数组的最后一位么·······但是假设这个数组不是回文数呢???这样的话你是算不出最后一位的······,你可以在输入的时候直接判断结束的时候加个a[i]='\0'结束符,加在数组最后一位的后一位,然后你可以用strlen(a)来判断长度,或者再输入的时候你就可以用i统计长度for(i=0,i;j>=i;i++,j--){if(c[i]==c[j])continue;else{printf("wrong\n");break;}}printf("yes\n");最后这一段······,假设是回文数没问题,不是的呢?,执行printf("wrong\n");这段以后依旧会执行printf("yes\n");这一段········,所以这里肯定是有问题的可以在printf("yes\n");这段前面加个判断,如果输出过wrong以后就不输出yes了····大概的话f=1;for(i=0,i;j>=i;i++,j--){if(c[i]==c[j])continue;else{f=0;printf("wrong\n");break;}}if(f)printf("yes\n");好吧,大概就是这样了·······,如果还有不懂的话可以追问

回答4:

这个实在太长了