整数高精度运算——加法
高精度运算是信息学的一种重要算法。这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。
高精度运算主要有以下几个步骤:
1、读取字符串,转换成数字倒序存储到整数数组中;
2、运算,注意进位和借位;
3、倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出;
高精度加法代码:
#include<stdio.h>
#include<string.h>
char s[1000]; //数组比较大时,应作为全局变量来定义
int a[1000]={0},b[1000]={0};
int main()
{
int l1,l2,l,i;
scanf("%s",s); //读第一个整数
l1=strlen(s); //求整数(字符串)的长度
for(i=0;i<=l1-1;i++) //将整数倒序存储到整数数组a中
{
a[l1-1-i]=s[i]-'0'; //s[i]是字符类型,通过减去0的ASCII码得到整数类型,如:将字符1转成数字1
}
scanf("%s",s); //读第二个整数
l2=strlen(s);
for(i=0;i<=l2-1;i++)
{
b[l2-1-i]=s[i]-'0';
}
if(l1>l2)
l=l1;
else
l=l2;
for(i=0;i<=l-1;i++) //加法运算
{
a[i]=a[i]+b[i];
if(a[i]>=10) //大于10的往高位进一位
{
a[i+1]=a[i+1]+1;
a[i]=a[i]-10;
}
}
if(a[l]!=0) //判断最高位是否有进位
l++;
for(i=l-1;i>=0;i--) //输出
printf("%d",a[i]);
}
高精度减法代码:
#include<stdio.h>
#include<string.h>
char s[1000];
int a[1000]={0},b[1000]={0},c[1000]={0};
int main()
{
int i,j,z,l1,l2,l,o;
freopen("hp-.in","r",stdin);
freopen("hp-.out","w",stdout);
scanf("%s",s); //a
l1=strlen(s);
for(i=0;i<=l1-1;i++) //把s(被减数)转换成数字,并倒序存入a数组
a[l1-1-i]=s[i]-'0';
scanf("%s",s);
l2=strlen(s);
for(i=0;i<=l2-1;i++) //把s(减数)转换成数字,并倒序存入b数组
b[l2-1-i]=s[i]-'0';
if(l1==l2){
for(j=l1;j>=0;j--)
{
if(a[j]>b[j]) //a大
{
o=0;
break;
}
if(b[j]>a[j]) //b大
{
o=1;
break;
}
}
}
if(l1>l2||o==0) //a大时 ,a-b
{
l=l1;
for(i=0;i<l;i++)
{
if(a[i]<b[i])
{
a[i]=a[i]+10;
a[i+1]=a[i+1]-1;
}
c[i]=a[i]-b[i];
}
while(l>1&&c[l-1]==0) l--; //舍去高位中无用的0
for(i=l-1;i>=0;i--) //输出
{
printf("%d",c[i]);
}
}
else
{
printf("-");
l=l2;
for(i=0;i<l;i++)
{
if(a[i]>b[i])
{
b[i]=b[i]+10;
b[i+1]-=1;
}
c[i]=b[i]-a[i];
}
while(l>1&&c[l-1]==0) l--; //舍去高位中无用的0
for(i=l-1;i>=0;i--) //输出
{
printf("%d",c[i]);
}
}
return 0;
}