归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
唯有主动付出,才有丰富的果实获得收获!
高精度乘法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "
const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数
string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],c[N],ans,ma; // a 和 b 存储两个大整数的每一位数字,c 存储结果,ans 用于进位,ma 记录较大数的位数
int main()
{
cin>>s1>>s2; // 输入两个大整数(以字符串形式)
int j=1,k=1;
// 将字符串 s1 的每一位数字从低位到高位存入数组 a
for(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';
// 将字符串 s2 的每一位数字从低位到高位存入数组 b
for(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';
// 获取两个大整数的最大长度
ma=max(s1.size(),s2.size());
// 模拟竖式加法,逐位相加并处理进位
for(int i=1;i<=ma;i++)
{
ans+=a[i]+b[i]; // 当前位相加,并加上上一位的进位
c[i]=ans%10; // 当前位的结果是相加后的个位数
ans/=10; // 更新进位值
}
// 如果最高位仍有进位,则需要额外增加一位
if(ans) c[++ma]=ans;
// 从高位到低位输出结果
for(int i=ma;i>=1;i--)
cout<<c[i];
return 0;
}
高精度减法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "
const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数
string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],c[N],ma; // a 和 b 存储两个大整数的每一位数字,c 存储结果,ma 记录较大数的位数
int main()
{
cin>>s1>>s2; // 输入两个大整数(以字符串形式)
// 如果 s1 小于 s2,则交换两者,并输出负号表示结果为负数
if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2))
{
cout<<'-'; // 输出负号
swap(s1,s2); // 交换 s1 和 s2 的值,确保 s1 始终是较大的数
}
int j=1,k=1;
// 将字符串 s1 的每一位数字从低位到高位存入数组 a
for(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';
// 将字符串 s2 的每一位数字从低位到高位存入数组 b
for(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';
// 获取两个大整数的最大长度
ma=max(s1.size(),s2.size());
// 模拟竖式减法,逐位相减并处理借位
for(int i=1;i<=ma;i++)
{
if(a[i]-b[i]<0) // 如果当前位不够减
{
a[i]+=10; // 向高位借 10
a[i+1]-=1; // 高位减 1
}
c[i]=a[i]-b[i]; // 当前位的结果是相减后的值
}
// 去掉结果中的前导零
while(c[ma]==0&&ma>1) ma--;
// 从高位到低位输出结果
for(int i=ma;i>=1;i--)
cout<<c[i];
return 0;
}
高精度乘法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "
const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数
string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],s[N],c[N],ans,ma; // a 和 b 存储两个大整数的每一位数字,s 存储中间结果,c 存储最终结果,ans 用于进位,ma 记录结果的最大可能位数
int main()
{
cin>>s1>>s2; // 输入两个大整数(以字符串形式)
int j=1,k=1;
// 将字符串 s1 的每一位数字从低位到高位存入数组 a
for(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';
// 将字符串 s2 的每一位数字从低位到高位存入数组 b
for(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';
// 计算结果的最大可能位数
ma=s1.size()+s2.size()-1; // 两个数相乘的结果最多有 s1.size() + s2.size() - 1 位
// 模拟竖式乘法,逐位相乘并累加到中间结果数组 s 中
for(int i=1;i<=s1.size();i++)
{
for(int j=1;j<=s2.size();j++)
{
s[i+j-1]+=a[i]*b[j]; // 将第 i 位和第 j 位相乘的结果累加到对应的位置
}
}
// 处理进位,将中间结果数组 s 转换为最终结果数组 c
for(int i=1;i<=ma;i++)
{
ans+=s[i]; // 累加当前位的值和之前的进位
c[i]=ans%10; // 当前位的结果是累加值的个位数
ans/=10; // 更新进位值
}
// 如果最高位仍有进位,则需要额外增加一位
if(ans) c[++ma]=ans;
// 去掉结果中的前导零
while(c[ma]==0&&ma>1) ma--;
// 从高位到低位输出结果
for(int i=ma;i>=1;i--)
cout<<c[i];
return 0;
}
高精度除法
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "
const int N=1e5+10; // 定义一个较大的数组大小,用于存储大整数
string s1; // 用于输入字符串形式的大整数
int a[N],b,c[N],ans,ma; // a 存储大整数的每一位数字,b 是除数,c 存储结果,ans 用于存储当前余数,ma 记录大整数的位数
int main()
{
cin>>s1>>b; // 输入大整数(以字符串形式)和除数 b
int j=1;
// 将字符串 s1 的每一位数字从低位到高位存入数组 a
for(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';
ma=s1.size(); // 获取大整数的位数
// 模拟竖式除法,逐位计算商和余数
for(int i=ma;i>=1;i--)
{
ans=ans*10+a[i]; // 当前余数乘以 10 加上当前位的数字
c[i]=ans/b; // 当前位的商是当前余数除以除数 b 的结果
ans%=b; // 更新余数为当前余数对除数 b 取模的结果
}
// 去掉结果中的前导零
while(c[ma]==0&&ma>1) ma--;
// 从高位到低位输出结果
for(int i=ma;i>=1;i--)
cout<<c[i];
return 0;
}
高精度阶乘和
#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "
const int N=1e5+10; // 定义一个较大的数组大小,用于存储大整数
int n,a[N],b[N],ans,ma,mb; // a 存储当前阶乘的结果,b 存储前 n 个阶乘的和,ans 用于进位,ma 和 mb 分别记录当前阶乘和总和的最大位数
int main()
{
cin>>n; // 输入 n,表示求前 n 个阶乘的和
for(int k=1;k<=n;k++) // 外层循环:求前 n 个阶乘的和
{
a[1]=1; ma=1; // 初始化当前阶乘为 1(即 1 的阶乘),并设置最大位数为 1
for(int i=1;i<=k;i++) // 内层循环:计算 k 的阶乘
{
ans=0; // 初始化进位值为 0
// 高精度乘法:将当前阶乘结果 a 乘以 i
for(int j=1;j<=ma;j++)
{
ans+=a[j]*i; // 当前位乘以 i 并加上之前的进位
a[j]=ans%10; // 当前位的结果是累加值的个位数
ans/=10; // 更新进位值
}
// 如果最高位仍有进位,则需要扩展位数
while(ans)
{
a[++ma]=ans%10; // 将进位值添加到新的高位
ans/=10; // 继续处理进位
}
}
// 更新总和的最大位数
mb=max(ma,mb); ans=0;
// 高精度加法:将当前阶乘结果 a 加到总和 b 中
for(int i=1;i<=mb;i++)
{
ans+=a[i]+b[i]; // 累加当前位和之前的进位
b[i]=ans%10; // 当前位的结果是累加值的个位数
ans/=10; // 更新进位值
}
// 如果最高位仍有进位,则需要扩展位数
if(ans) b[++mb]=ans;
}
// 从高位到低位输出结果
for(int i=mb;i>=1;i--)
cout<<b[i];
return 0;
}