高精度加减乘法模板

#include<stdio.h>
#include<string.h>
const int MAX=1e5+5;
char s1[MAX],s2[MAX];
struct node
{
int a[MAX],b[MAX],res[2*MAX],temp,len1,len2;
void init()
{
memset(a,0,sizeof(a));//清空操作数
memset(b,0,sizeof(b));//同上
memset(res,0,sizeof(res));//
temp=0;
}
void mul(char *_a,char *_b)//高精度乘法函数
{
init();
len1=strlen(_a);
len2=strlen(_b);
for(int i=0,j=len1-1; i<=len1-1; i++,j–)
a[i]=_a[j]-‘0’;
for(int i=0,j=len2-1; i<=len2-1; i++,j–)
b[i]=_b[j]-‘0’;
for(int i=0; i<=len1; i++)
for(int j=0; j<=len2; j++)
res[i+j]+=a[i]b[j];
for(int i=0; i<len1+len2; i++)
if(res[i]>=10)
{
res[i+1]+=res[i]/10;
res[i]%=10;
}
for(int i=2
MAX-1; i>=0; i–)
if(res[i]!=0)
{
temp=i;
break;
}
for(int j=temp; j>=0; j–)
printf("%d",res[j]);
printf("\n");
}
void sub(char *_a,char *_b)//高精度减法函数(操作数1>操作数2)举例(操作数1 1329 操作数2 987)
{
init();//初始化
len1=strlen(_a)//求操作数1的位数; 1329的位数为4
len2=strlen(_b);//求操作数2的位数 987的位数为3
for(int i=0,j=len1-1;i<=len1-1; i++,j–)//将由字符类型保存的操作数1转化为整型逆序存入数组 9 2 3 1
a[i]=_a[j]-‘0’;
for(int i=0,j=len2-1;i<=len2-1;i++,j–)//将操作数2进行如上操作 7 8 9
b[i]=_b[j]-‘0’;
for(int i=0;i<=len1-1;i++)//把两个数每位依次相减
{
a[i]-=b[i]; //数位相减 (若不处理借位 a数组中依次为 2 -6 -6 1)
if(a[i]<0) //处理借位 向高位借(2 -6 -6 1 -> 2 -6+10 -6 1 -> 2 4 -7+10 0 -> 2 4 3 0)
{
a[i]+=10;
a[i+1]–;
}
}
for(int i=len1-1;i>=0;i–) //高位除零 (注意数组从0下标开始,到len1-1长度为len1) 2 4 3
{
if(a[i])
{
temp=i;//遇到第一位高位不为0退出循环
break;
}
}
for(int i=temp;i>=0;i–)//从高位到低位输出 3 4 2
printf("%d",a[i]);
printf("\n");//换行
}
void add(char _a,char _b)//高精度加法函数(举例: _a == 98 _b== 132)
{
init();//初始化
int len;//保存两个操作数位数大的位数
len1=strlen(_a);//求操作数1的位数 (98 的位数为2)
len2=strlen(_b);//求操作数2的位数 (132 的位数为3)
for(int i=0,j=len1-1;i<=len1-1;i++,j–)//将由字符类型保存的操作数1转化为整型逆序存入数组 (整型数组a依次保存 8 9)
a[i]=_a[j]-‘0’;
for(int i=0,j=len2-1;i<=len2-1;i++,j–)//将操作数2进行如上操作 (整型数组b依次保存2 3 1)
b[i]=_b[j]-‘0’;
len=(len1>len2)?len1:len2;//把两个操作数较大的位数存入变量len (两个数中的位数较大的是3)
for(int i=0;i<=len-1;i++)//把两个数字每位相加 (若不进行进位处理 a数组依次保存的会是 10 11 1)(低位—>高位)
{
a[i]+=b[i];
if(a[i]>=10)//处理进位 (从低位向高位进位 10 11 1—>0 11+1 1—>0 12 1-> 0 2 2)
{
a[i+1]++;
a[i]-=10;
}
}
if(a[len])//如果最高位不为0,则把len++,len即所得和的位数 (因为两个数相加的最大位数只可能与两个数字较大数相等或比较大数位数大1) 比如极限数据9999999 99999999 得20000000-2 即比较大数的位数大1
len++;
for(int i=len-1;i>=0;i–)//按从高到低位输出 1 2 2逆序输出的 220
printf("%d",a[i]);
printf("\n");//换行
}
} hpg;
int main()
{
while(~scanf("%s%s",s1,s2))//输入存放两个数字的数组
{
hpg.add(s1,s2);//调用对两个数字求和(高精度加函数)并输出的和
}
return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值