算法学习——高精度加法

题目描述

给定两个字符串形式的非负整数a,ba,b ,计算它们的和。
此处a,ba,b的数的位数不超过1000位\

输入描述

对于第一行,给出一个非负整数aa.
对于第二行,给出一个非负整数bb

输出描述

给出对应a+b的结果

测试样例

输入数据 1

1234
2

Copy

输出数据 1

1236

我的一个想法仅仅是用利用字符转数字进行加法运算,所以构成了以下的代码

#include<stdio.h>
int main(void)
{	
	int count1=0,count2=0,c=0,d=0;
	char a[1001] ,b[1001];
	scanf("%s", a);
	scanf("%s", b);
	for(int i=0;a[i]!='\0';i++)
	{
		c=a[i]-'0';
		count1=c+count1*10;
	}
	for(int j=0;b[j]!='\0';j++)
	{
		d=b[j]-'0';
		count2=d+count2*10;
	}
	printf("%d",count1+count2);
	return 0;
}

但是题目要求要达到1000位,仅仅用字符串转int是不可靠的,当位数达到整形无法承受的位数的时候,就得不到运算的结果,所以我在学长的帮助下,查找资料,找到以下进行高精度加法的方法

#include<stdio.h> 
static const int len=1001
int a[len], b[len], c[len];
void clear(int a[])//清空数组 
{
	for (int i = 0; i < LEN; ++i) 
		a[i] = 0;
}
// 以字符串的形式读入数据 转成int[]进行存储
void read(int a[]) {

    // 此处LEN+1的原因是%s读入数据时会在读入所有数据之后末尾用'\0'表示
    static char s[LEN + 1];
    scanf("%s", s);

    // 写入int[]前清空数组内之前的数据
    clear(a);

    // 通过strlen获取字符数组内的长度
    int len = strlen(s);

    // 此处减'0'的原因是因为字符转数字类型的时候通过此方法转换
    // for循环也就是遍历每一位进行转换
    for (int i = 0; i < len; ++i) 
		a[len - i - 1] = s[i] - '0';
}
//输出函数
void print(int a[]) {
    int i;
    
    // 因为我们每次输入时都将数组内的所有位赋值0
    // 此处的for循环也就是想将i放到他有效位的个位
    for (i = LEN - 1; i >= 1; --i)
        if (a[i] != 0) break;

    // 将int类型转char输出 也就是+'0'
    for (; i >= 0; --i) putchar(a[i] + '0');
    putchar('\n');
}

//加法函数(竖式加法)
void add(int a[], int b[], int c[]) {
    //清空结果数组
    clear(c);

    for (int i = 0; i < LEN - 1; ++i) {
        
        // 相加(此处用的是+= 是考虑到后面的进位方便)
        c[i] += a[i] + b[i];
        // 判断是否需要进位
        if (c[i] >= 10) {
            // 进位
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}

int main() {
    // 读取数字A
    read(a);
    
    // 读取数字B
    read(b);
    
    // A+B
    add(a, b, c);
    
    // 调用输出函数输出
    print(c);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值