(C语言)高精度加法

来源:互联网 发布:上海中科软件 编辑:程序博客网 时间:2024/05/17 08:42

题目描述

我们知道 int 和 long 类型的变量在64位操作系统中能表示的数据范围为[-2^31, 2^31 - 1], long long 类型的变量能表示的数据范围为 [-2^63, 2^63 - 1], 但是现在我们需要计算的数据超过了long long 型数据能表示的范围。这时候我们就需要使用高进度算法。什么是高精度算法呢,简单来说,就是使用整数数组或者字符数组来表示一个long long 型数据无法表示的大数(正数或负数). 然后用这两个数组来模拟加法和减法运算,从而实现任意范围数字的相加减。

输入

输入有多组数据。

对于每组测试数据,在一行中给出两个正整数a,b(a,b的位数小于等于1000),中间用一个空格隔开。

当读到文件结尾时输入结束


输出

对于每组输入,在一行中输出两个正整数相加的结果。

样例输入

123456 123123456789 9876543215555555555555555555 66666666666666

样例输出

12357911111111105555622222222222221
(高精度即输入的数据已经大大的超过了int 和long的数据范围,所以基本思想就是将输入的数据以字符串的形式保存到一个字符数组中,然后将字符数组倒置,因为不倒置不好处理相加之后的进位,然后从两个字符数组的第一个元素分别向后相加,如果相加后的结果大于零则向前进一,然后该位取除以十之后的余数,最后输出相加后的字符串数组即可)



#include<stdio.h>

#include<string.h>
int main(){
char a1[1000],a2[1000];
int an1[1000]={0},an2[1000]={0};
int lena1,lena2,i;
void addition(int a[],int b[],int k1,int k2);
while(scanf("%s%s",a1,a2)!=EOF){   //读到文件结尾处结束
lena1=strlen(a1);
lena2=strlen(a2);
for(i=0;i<lena1;i++)
an1[i]=a1[lena1-i-1]-'0';  //将数组倒置并将字符类型转换为数字类型,下同
for(i=0;i<lena2;i++)
an2[i]=a2[lena2-i-1]-'0';
addition(an1,an2,lena1,lena2);
}
return 0;
}
void addition(int a[],int b[],int k1,int k2){
int c[1001]={0},k,i;
k=( k1>k2 ? k1:k2);
for(i=0;i<k;i++){  //同位相加
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
}
if(c[k]) k++;
for(i=k-1;i>=0;i--)
printf("%d",c[i]);
printf("\n"); 
}
0 0
原创粉丝点击