C-大數相乘大數相除
阿新 • • 發佈:2021-02-07
結果:
程式碼:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int main() { int a[9],b[9],c[19],d[9],e[28],g[28]; int n; scanf("%d",&n); int w=n,x=n+1,y=2*n+1,i=0,j=0,k,p,q,f,h=0,t; int temp; while(w>0) { a[i++]=w%10; //兩個因數存為陣列,從個位開始存 w/=10; } while(x>0) { b[j++]=x%10; x/=10; } for(k=0;k<19;k++) //乘積陣列初始化為0 { c[k]=0; } for(p=0;p<i;p++) { f=p; for(q=0;q<j;q++) { c[f]+=a[p]*b[q]; //從各位開始逐位相乘 c[f+1]+=c[f]/10; c[f++]%=10; } } ///以上是兩個大數相乘,c[]為乘積從個位開始的倒序排列 while(y>0) //2*n+1 { d[h++]=y%10; y/=10; } for(k=0;k<28;k++) //乘積陣列初始化為0 { e[k]=0; g[k]=0; } for(p=0;p<f;p++) { t=p; for(q=0;q<h;q++) { e[t]+=c[p]*d[q]; //從各位開始逐位相乘 e[t+1]+=e[t]/10; e[t++]%=10; } } ///以上是三個大數相乘,e[]為乘積從個位開始的倒序排列 for(i=0;i<28;i++) { printf("%d ",e[i]); } for(i=0,t--;i<=t/2;i++) //將逆置的陣列反轉為正序 { temp=e[i]; e[i]=e[t-i]; e[t-i]=temp; } printf("\n"); for(i=0;i<28;i++) { printf("%d ",e[i]); } ///大數除法 for(i=0;i<=t;) { g[i]=e[i]/6; k=e[i]%6; e[++i]+=k*10; } printf("\n"); for(i=0;i<28;i++) { printf("%d ",g[i]); } return 0; }