高精度 加减乘 阶乘 模板 ------------------------C语言——菜鸟级
【摘要】
long int res[N];
void add(long int *a,long int *b)//高精度加法
{long int i,k=0,adw=0,flag=0,tem1,tem2;
...
long int res[N];
void add(long int *a,long int *b)//高精度加法
{long int i,k=0,adw=0,flag=0,tem1,tem2;
for(i=0;flag!=2;i++,k++)
{ if(a[i]==-1)tem1=0;else tem1=a[i];
if(b[i]==-1)tem2=0; else tem2=b[i];
res[k]=tem1+tem2+adw;//adw 进位位
adw=res[k]/10000;
res[k]=res[k]%10000;
if(a[i+1]==-1)flag++;
if(b[i+1]==-1)flag++;
}if(adw)res[k++]=adw;//判断进位是否有值
res[k+1]=-1;//标记最高位 }
void sub(long int *a,long int *b)//高精度 减法
{ long int tem,i,k=0,subw=0,flag=0;
for(i=0;flag!=2;i++)
{ if(b[i]==-1)tem=0;else tem=b[i];
if(a[i]>=(tem+subw))res[k++]=a[i]-tem-subw,subw=0;//subw借位位
else res[k++]=10000+a[i]-tem-subw,subw=1;
if(a[i+1]==-1)flag++;
if(b[i+1]==-1)flag++;
}
while(res[k]<=0&&k>0)res[k]=0,k--;//去首位0
res[k+1]=-1;//标记最高位
}
void mult(long int *a,long int *b)//高精度 乘法
{ long int i,j,k;
for(i=0;a[i]!=-1;i++)
{
for(j=0;b[j]!=-1;j++)
{ res[i+j]+=a[i]*b[j];
if(res[i+j]>=10000)res[i+j+1]+=res[i+j]/10000,res[i+j]%=10000;
}
k=i+j+1;
while(res[k]>=10000)res[k+1]+=res[k]/10000,res[k]%=10000,k++;
}while(res[k]<=0&&k>0)k--;//去首位0
res[k+1]=-1; }
void dsjc(long int n)//计算阶乘
{ long int i,j,m;long long int a[n];
memset(a,0,sizeof(a));
a[0]=1; j=0;m=0; //初始化
do//计算阶乘 从 n 到 1 反计算
{ for(i=j=0;i<=m;i++)
j+=a[i]*n,a[i]=j%C,j/=C;//C 为进制 此时 为 5位(100000)
j?a[++m]=j:0;//判断是否进位
}while(--n);
printf("%ld",a[m]);//输出
while(m) printf(" %05ld ",a[--m]);printf("\n");}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。
原文链接:fivecc.blog.csdn.net/article/details/80542754
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)