算法学习-高精2-高精度乘法和除法(非高精作为除数)
高精度乘法和除法
前言
为什么要用高精?
因为C++不自带高精,进行大数的运算long long会爆掉
< 高精度乘法 >
一、实现思路
和高精度加法减法一样,都是先用string类输入,然后再倒叙输入给int型数组
string str1,str2;
cin>>str1>>str2;
int len1=str1.size();
int len2=str2.size();
for(i=1;i<=len1;++i) arr1[i]=str1[len1-i+1]-'0';
for(i=1;i<=len2;++i) arr2[i]=str2[len2-i+1]-'0';
然后逐位进行乘法,和加减不同,乘法要用两层循环,来模拟小学竖式乘法,而且通过规律可以知道,乘数 A 的第 i 位数与乘数 B 的第 j 位数相乘,其结果对应的是结果 C 的第 i+j-1 位数。
for(j=1;j<=len1;++j)
for(i=1;i<=len2;++i)
{
c[i+j-1]+=arr1[j]*arr2[i];
c[i+j]+=c[i+j-1]%10;
c[i+j-1]=c[i+j-1]/10;
}
最后就是输出了,容易知道,输出结果 C 的最大位数为 A 的位数 len1 加上 B 的位数 len2,当然还要删除前导0。
int len3=len1+len2;
while(c[len3]==0&&len3>1) --len3;
for(i=len3;i>=1;--i)
cout<<c[i];
接下来是完整代码
二、代码实现
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1,str2;
int arr1[10050]={0},arr2[10050]={0},c[100000]={0};
int i=0,j=0,len1=0,len2=0,len3=0;
cin>>str1>>str2;
len1=str1.size();
len2=str2.size();
for (i=1;i<=len1;++i)
arr1[i]=str1[len1-i]-'0';
for(i=1;i<=len2;++i)
arr2[i]=str2[len2-i]-'0';
for(i=1;i<=len1;++i)
for(j=1;j<=len2;++j)
{
c[i+j-1]+=arr1[i]*arr2[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]=c[i+j-1]%10;
}
len3=len1+len2;
while(c[len3]==0&&len3>1) --len3;
for(i=len3;i>=1;--i)
cout<<c[i];
return 0;
}
还挺简单的。
<高精度减法>
一、<高精除以低精>
1、实现思路
输入部分不多赘述,直接上代码:
string str;
int d,arr[i];
cin>>str>>d;
len=str.size()
for(i=1;i<=len;++i) arr[i]=str[i-1]-'0';//除法就是从高位开始,故此处不许倒叙赋值
然后就是核心部分,其实也简单,由于商的最高位 小于等于 len,所以直接从len开始循环,然后就是喜闻乐见的竖式除法的进行:
for(i=1;i<=len;++i)
{
c[i]=(arr[i]+x*10)/d;//x要提前定义并初始化为 0 .
x=(arr[i]+x*10)%d;
}
最后删除前导0并输出商,余数也可以顺带一起输出了
i=1;
while(arr[i]==0&&i<len) ++i;
for(i;i<=len;++i)
cout<<arr[i];
2、代码实现
也老简单了
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int c[10000]={0},arr[10000]={0},d=0,i=0,x=0;
cin>>str>>d;
int len=str.size();
for (i=len;i>=1;--i) arr[i]=str[i-1]-'0';
for (i=1;i<=len;++i)
{
c[i]=(x*10+arr[i])/d;
x=(x*10+arr[i])%d;
}
for (i=1;c[i]==0&&i<len;++i);
for (i;i<=len;++i)
cout<<c[i];
return 0;
}
二、<高精除以高精>
明天补上,快没时间了。
最后
不愉快

浙公网安备 33010602011771号