高精度算法

加法(不包括负数)

#include<bits/stdc++.h>
using namespace std;
char cha[505],chb[505];//刚开始用字符输入两个加数 ;500位左右加法
int a[505],b[505],c[505],x; //int类型a,b存储两加数方便计算 ;存储加数之和
int main()
{
cin>>cha>>chb;
int lena=strlen(cha),lenb=strlen(chb),lenc=1;
for(int i=0;i<=lena-1;i++)//字符数组转换为a,b数组;并将数字倒序(例:用1234等价于4321,且进位都可以在右边,只是结果需要再次倒叙
                                     //+34         +43
a[lena-i]=cha[i]-'0';// 第一个数存储到a[1],所以lenc初值为1
for(int i=0;i<=lenb-1;i++)
b[lenb-i]=chb[i]-'0';

while(lenc<=lena || lenc<=lenb) //*核心算法
{
c[lenc]=a[lenc]+b[lenc]+x;//加上进位x
x=c[lenc]/10;
c[lenc]=c[lenc]%10;
lenc++; //功能差不多为lenc=max(lena,lenb)+1,也避免了0+0无数可输出的情况
}
c[lenc]=x;//若位数会比任意一个加数大一,最高位为最后的进位;但也要考虑不是的情况,此时x为0,即最高位无效
if(x==0)
lenc--;
for(int i=lenc;i>=1;i--)//倒叙输出结果
cout<<c[i];
return 0;
}

 

减法

#include<bits/stdc++.h>
using namespace std;
char cha[505],chb[505],ch[505];//ch为容器
int a[505],b[505],c[505],x;
int main()
{
cin>>cha>>chb;
int lena=strlen(cha),lenb=strlen(chb),lenc=1;
if(lena<lenb || lena==lenb && strcmp(cha,chb)<0)
{
swap(lena,lenb);
strcpy(ch,cha);//strcpy将cha复制到ch内
strcpy(cha,chb);
strcpy(chb,ch);
cout<<"-";
}

for(int i=0;i<=lena-1;i++)
a[lena-i]=cha[i]-'0';
for(int i=0;i<=lenb-1;i++)
b[lenb-i]=chb[i]-'0';

while(lenc<=lena || lenc<=lenb)
{

if(a[lenc]<b[lenc])
{
a[lenc]+=10;
a[lenc+1]--;
}
c[lenc]=a[lenc]-b[lenc];
lenc++;//同理加法
}
while(c[lenc]==0 && lenc>1)//lenc>1保证两数相等相减后值为0可以输出
lenc--;//最高位0不输出
for(int i=lenc;i>=1;i--)
{
cout<<c[i];
}
return 0;
}

 

乘法 非负整数 一百位以内

#include<bits/stdc++.h>
using namespace std;
char cha[102],chb[102];
int a[102],b[102],c[204],x;
int main()
{
cin>>cha>>chb;
int lena=strlen(cha),lenb=strlen(chb),lenc;
for(int i=0;i<=lena-1;i++)
a[lena-i]=cha[i]-'0';
for(int i=0;i<=lenb-1;i++)
b[lenb-i]=chb[i]-'0';

for(int i=1;i<=lena;i++)
{
x=0;
for(int j=1;j<=lenb;j++)
{
c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;//x是上一次的乘积进位
c[i+j-1]=c[i+j-1]%10;
}
c[i+lenb]=x;//补最后的乘积进位
}
lenc=lena+lenb;//最终位数最大为 两位数之和
while(c[lenc]==0 && lenc>1) //删前导0 / 最高位0 /且若乘积为0,保留位数
lenc--;
for(int i=lenc;i>=1;i--)
cout<<c[i];
return 0;
}

 

 除法 非负整数 高精度除以低精度  逐位试商法

#include<bits/stdc++.h>
using namespace std;
char cha[5005];
long long b,a[5005],c[5005],x;
int main()
{
cin>>cha>>b;
int lena=strlen(cha),lenc=1;
for(int i=0;i<=lena-1;i++)
{
a[i+1]=cha[i]-'0';
}
for(int i=1;i<=lena;i++)
{
c[i]=(a[i]+x*10)/b;
x=(x*10+a[i])%b;
}
while(c[lenc]==0 && lenc<lena)
{
lenc++;
}
for(int i=lenc;i<=lena;i++)
cout<<c[i];//商
// cout<<" "<<x;//余数
return 0;
}

 

 

 

加法/模板(?)

#include <iostream>
#include <vector>

using namespace std;

vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);

vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}

if (t) C.push_back(t);
return C;
}

int main()
{
string a, b;
vector<int> A, B;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');

auto C = add(A, B);

for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
cout << endl;

return 0;
}

作者:zyc_3
链接:https://www.acwing.com/activity/content/code/content/2418401/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2022-08-06 16:54  李某某LLLLL  阅读(49)  评论(0)    收藏  举报