OJ笔记 1046 计算高精度加法

1046 计算高精度加法

Description
由键盘输入两个位数很长的整数(一行一个,最多不超过80位),试计算并输出这两个数的和。

输入样例
1234567890123456789353534532453453453434534
987654321098765324534534534534532

输出样例
1234567891111111110452299856987987987969066

提示
注意,一个普通的变量不能保存十多位长的整数

#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <math.h>

using namespace std;

int main()
{
    //后面如果用到strlen,一定要用char,因为strlen只能用于计算字符串的长度
    char x[100],y[100];
    int lx,ly;//x,y长度

    //char数组转化为int数组
    int a[100] = {0},b[100] = {0},c[105] = {0};

    //字符串x转化为int数组
     /*输入字符串的时候,不用for循环(注意区分字符串和int类型数组)
    同时,最好不要用gets(),因为gets()是被抛弃的函数*/
    scanf("%s",x);
    lx = strlen(x);
    for(int i = 0;i < lx;i++){
        a[i] = x[lx - 1 - i] - '0';//下标顺序翻转
    }
    //字符串y转化为int数组
    scanf("%s",y);
    ly = strlen(y);
    for(int i = 0;i < ly;i++){
        b[i] = y[ly - 1 - i] - '0';//下标顺序翻转
    }

    int ma = max(lx,ly);//c长度
    //计算x+y(存入数组c中)
    int k = 0;//进位
    for(int i = 0;i < ma;i++){
        c[i] = (a[i] + b[i] + k) % 10;//各位相加
        k = (a[i] + b[i] + k) / 10;//进位
        /*如果相加小于10,k=0;否则进一位,所以上面两个式子都要加上k;*/
    }
    if(k != 0){ //最高位需要进位(即最后得出k不等于0)
        ma++;//高一位
        c[ma - 1] = k;
    }

    //逆序输出,得到结果
    for(int i = ma - 1;i >=0;i--){
        printf("%d",c[i]);
    }

    return 0;
}


参考:SCAU 计算高精度加法(C Programming)

计算机科学中,尤其是在线竞赛(OJ,Online Judge)中,处理高精度加法一个常见的任务,因为通常涉及的大整数超出了标准数据类型(如int或long long)的范围。在C语言中,要实现高精度加法,一种常用的方法是使用数组或者动态内存分配来存储大整数进行加法运算。 以下是一个简单的高精度加法算法的步骤: 1. 定义两个整数数组,每个元素存储一位数字。 2. 初始化两个指针,分别指向这两个数组的末尾。 3. 当两个指针所指向的位数相同时,将较小数组的剩余补零。 4. 对应置的数字进行加法(0-9,10可能需要进),更新结果数组。 5. 如果在某个步骤发生了进,需要在前一个置增加1。 6. 指针向前移动一,直到其中一个指针达到数组末尾。 7. 如果还有剩余的进,将它加到结果数组的最前面。 这是一个简化版的描述,实际的代码实现会涉及到更多的边界检查和错误处理。下面是一个简化的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DIGITS 10000 // 可以根据需要调整 char* addStrings(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); int max_len = len1 > len2 ? len1 : len2; int carry = 0; char* result = (char*)malloc((max_len + 1) * sizeof(char)); result[max_len] = '\0'; for (int i = max_len - 1; i >= 0; --i) { int sum = carry + (str1[i] - '0') + (str2[i] - '0'); result[i] = sum % 10 + '0'; carry = sum / 10; } if (carry) { result = carry + '0'; } return result; } int main() { char* str1 = "123456789"; char* str2 = "987654321"; char* result = addStrings(str1, str2); printf("Result: %s\n", result); free(result); // 一定要记得释放动态内存 return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值