模块化高精度解,附赠加减乘(没有除)模块
2025-08-15 17:10:18
发布于:上海
5阅读
0回复
0点赞
#include<bits/stdc++.h>
#define SIZE 1019
using namespace std;
void converts(int *a,string s){
reverse(s.begin(),s.end());
int i,len=s.size();
for(i=0;i<len;i++)a[i]=s[i]-'0';
}
void add(int *a,int *b,int len=SIZE){
for(int i=0;i<len;i++){
if((a[i]+=b[i])>=10){
a[i]-=10;
a[i+1]++;
}
}
}
void print(int *a,int len=SIZE){
int i;
for(i=len;i>0;i--)if(a[i]>0)break;
for(int j=i;j>=0;j--)cout<<a[j];
}
bool le(int *a,int *b,int len=SIZE){
int i;
for(i=len-1;a[i]==b[i]&&i>=0;i--);
return i<0||a[i]<b[i];
}
void mul(int *c,int *a,int *b){
converts(c,"0");//重设(最低位为零)
for(int i=0;i<SIZE;i++)
for(int j=1;j<=b[i];j++)//重复b[i]次
add(c+i, a, SIZE-i);//模拟乘法
// c+i指针,从c+i开始 SIZE-i对应防越界
}
void mulint(int *a,int b){
for(int i=0,c=0;i<SIZE;i++){
c=c/10+a[i]*b;//理论上输出c即可
a[i]=c%10;//但是我们是void要改变a
}
}
void sub(int *a,int *b,int len=SIZE){
for(int i=0;i<len;i++){
if((a[i]-=b[i])<0){
a[i+1]--;
a[i]+=10;
}
}
}
void copy(int *a,int *b,int len=SIZE){
for(int i=0;i<len;i++)a[i]=b[i];
}
int ans[SIZE],f[SIZE];
int main(){
converts(ans,"0");
converts(f,"1");
int n;
cin>>n;
for(int i=1;i<=n;i++){
mulint(f,i);
add(ans,f);
}
print(ans);
return 0;
}
这里空空如也
有帮助,赞一个