高精度加减乘法
高精度的加法
#include<bits/stdc++.h>
#define MAXN 10000000
using namespace std;
string a,b;
int na[MAXN],nb[MAXN],ans[MAXN];
int main()
{
cin>>a>>b;
for(int i = a.size() ; i > 0 ; i--)na[i] = a[a.size() - i ] - '0';
for(int i = b.size() ; i > 0 ; i--)nb[i] = b[b.size() - i ] - '0';
int maxl = max(a.size(), b.size())+1;//由于加法可能最高位会向前进位,所以应该开辟比最高位还大1位的数组
int pw = 0;//定义一个变量去记录每次后一位进位
for(int i = 1 ; i < maxl ; i++)
{
ans[i] += pw;//先加上前一位进位的1,如果没进位加0不影响
pw = 0;//每次进位完都应该将pw清0
if(ans[i] + na[i] + nb[i] >= 10)
{
pw = 1;
na[i] -= 10;
}
ans[i] += na[i] + nb[i];
}
if(pw==1)
ans[maxl]=1;
while(ans[maxl] == 0)maxl--;
for(int i = maxl ; i > 0 ; i--)cout<<ans[i];
if(maxl < 1)cout<<"0";
return 0;
}
高精度的减法
#include<bits/stdc++.h>
#define MAXN 10500
using namespace std;
string a,b;//因为是高精度计算所以输入的数据可能很大,所以需要用字符串代替整形输入。
int na[MAXN],nb[MAXN],ans[MAXN];
bool pd;
int main()
{
cin>>a>>b;
if((a < b && a.size() == b.size())|| a.size() < b.size())//因为减法如果a的值比b小的话就会输出负数,我们可以先判断a和b的大小,用一个bool去记录大小,再用大的减小的,等最后算完了再根据bool的数值去 //选择是否添加‘-’号。判断哦a,b大小时,应该判断当a,b长度相同时的a,b的字典值大小,判断不同长度的a,b可以直接知道长度大的自然值更大。
{
swap(a , b);当a<b时 ,交换a,b,否则不进入if语句。
pd = true; //记录为负数
}
for(int i = a.size() ; i > 0 ; i--)na[i] = a[a.size() - i ] - '0';//倒序输入可以使尾部对齐,因为高精度的本质是竖式运算,要从个位开始算起。
for(int i = b.size() ; i > 0 ; i--)nb[i] = b[b.size() - i ] - '0';
int maxl = max(a.size(), b.size());
for(int i = 1 ; i <= maxl ; i++)
{
if(na[i] < nb[i])//当同一位的数不够减时,应像竖式运算一样向上一位借1
{
na[i + 1]--;//此时上一位应该减1
na[i] += 10;//下一位应该加10
}
ans[i] = na[i] - nb[i];
}
while(ans[maxl] == 0)maxl--;当有前导0时需去掉
if(pd ==true)cout<<"-";
for(int i = maxl ; i > 0 ; i--)cout<<ans[i];倒序输出
if(maxl < 1)cout<<"0";
return 0;
}
高精度乘法
#include<iostream>
#include<string>
using namespace std;
const int maxn = 1e5+5;
int main()
{
string s1,s2;
cin>>s1>>s2;
int a[maxn],b[maxn];
int n=s1.size();
int m=s2.size();
for(int i = 0 , j = n - 1 ; i < n ; i++ , j--)
{
a[i] = s1[j] - '0';
}
for(int i = 0 , j = m - 1 ; i < m ; i++ , j--)
{
b[i] = s2[j] - '0';
}
int c[maxn];
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < m ; j++)
{
c[i + j] += a[i] * b[j];
}
}
for(int i = 0 ; i < n + m ; i++)
{
if(c[i] >= 10)
{
c[i+1] += c[i]/10;//将每一个c[i]里的数的除个位以外的除以10向前进位
c[i] %= 10;//将每一个c[i]的除个位以外的数去除,即c[i]%10,将个位的数保留
}
}
int maxl = n + m;
while(c[maxl]==0)maxl--;
if(maxl<1)cout<<'0';
else
for(int i = maxl ; i >= 0 ; i--)
{
cout<<c[i];
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效