高精度乘法&除法

高精度加法&减法关键点:
· 接收字符串的方式;
· 字符串转整数数组,要根据实际情况判定是否需要倒序存储;
· 字符转换整数要知道Ascii码表的作用;

#include <bits/stdc++.h>
using namespace std;
int main(){
  int i,j,a=0;
  for(i=0;i<10000;i++)     //改为100000
    for(j=0;j<10000;j++)   //改为100000
      a++;
  return 0;


· 加法结果数组c的实际长度是两加数最大值+1;
· 减法需要判断两数大小,大数作为被减数;
· 结果数组c的最高位可能没有进位,需要去除冗余0;

高精度乘法:
乘法的解决方案


竖式乘法的规律:a[ i ] * b[ j ] = c[ i+j ]
注意:
1. 因为也是从低位开始计算,最高位有可能进位,存储到整型数组时需要倒序;
2. 根据竖式的特点,需要两层循环;
3. 因为有可能最高位不会进位,所以需要去冗余的0;

//高精度乘法
#include<bits/stdc++.h>
using namespace std;
char str1[2005],str2[2005];
int a[2005],b[2005],c[2005];
int l1,l2,l3;
int main(){
cin>>str1>>str2;
l1=strlen(str1);
l2=strlen(str2);
l3=l1+l2;
for(int i=0;i<l1;i++)
a[i]=str1[l1-i-1]-'0';
for(int i=0;i<l2;i++)
b[i]=str2[l2-i-1]-'0';
for(int i=0;i<l1;i++)
for(int j=0;j<l2;j++){
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
while(c[l3-1]==0 && l3>1)
l3--;
for(int i=l3-1;i>=0;i--)
cout<<c[i];
return 0;
}

高精度除以低精度

注意:
1. 除法竖式运算,是从高位向低位进行运算,这和之前的运算是不一样的,之前的运算都是由低向高
位运算,并且进位;
2. 除法竖式由高向低运算的同时,余数会计入下一位运算,这是运算的一个小重点。

//高精度除以低精度
#include<bits/stdc++.h>
using namespace std;
char str[5005];
long long a[5005],b,c[5005],x,la,lc;
int main(){
cin>>str>>b;
la=strlen(str);
for(int i=0;i<la;i++)
a[i]=str[i]-'0';
//相除的过程
for(int i=0;i<la;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
//从位置0删除前导0
lc=0;
while(c[lc]==0 && lc<la-1)   //****
lc++;
//输出结果
for(int i=lc;i<la;i++)
cout<<c[i];
return 0;
}

这是2023年最后一篇文章了,感谢大家的支持与鼓励,希望我们在新的一年增长学识,越来越好!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值