1 /* 2 =============================== 3 Code instruction 4 5 Coding by Kaka·"Ricochet"·Simpson 6 7 GreatIntCal. 8 =============================== 9 */ 10 #define MaxL 1000 11 #include <stdio.h> 12 #include <string.h> 13 void intcpy(int a[],int b[]); 14 void ArrayPrint(int a[]); 15 void init(int a[]); 16 void div(int a[],int b[],int c[]); 17 18 19 int main() 20 { 21 int a[MaxL],b[MaxL],c[MaxL]; 22 init(a); 23 init(b); 24 div(a,b,c); 25 } 26 void intcpy(int a[],int b[]) //交换数组内容 27 { 28 int i; 29 int t; 30 if(a[0]>b[0]) i=a[0]; 31 else i=b[0]; 32 for(;i>=0;i--) 33 { 34 t=a[i]; 35 a[i]=b[i]; 36 b[i]=t; 37 } 38 } 39 40 void ArrayPrint(int a[]) //此函数读取数组中a[0]储存的数组长度,并从后往前打印数组数字。 41 { 42 int i; 43 if(a[0]<0) 44 { 45 a[0]*=-1; 46 printf("-"); 47 } 48 for(i=a[0];i>0;i--) 49 printf("%d",a[i]); 50 printf(" "); 51 } 52 53 void init(int a[])//此函数读取一串数字,并把数字转换为数组,数组0位储存长度。 54 { 55 char str[1000]; 56 int i; 57 scanf("%s",str); 58 memset(a,0,sizeof(a)*MaxL); 59 a[0]=strlen(str); 60 for(i=1;i<=a[0];i++) 61 a[i]=str[a[0]-i]-'0'; 62 } 63 64 void div(int a[],int b[],int c[]) //此函数以一高精度数a除以一个低精度数b,结果存放于c。输出一次并包含20位小数 65 { 66 //将b设为一个数 67 int len,x,i,j,bnum=0; 68 x=1; 69 for(i=1;i<=b[0];i++) 70 { 71 bnum+=b[i]*x; 72 x*=10; 73 } 74 //ArrayPrint(a); // 75 //printf("%d ",bnum); 76 //开始除 77 for(i=1,j=a[0];i<j;i++,j--) 78 { 79 x=a[i];a[i]=a[j];a[j]=x; 80 } 81 //ArrayPrint(a); // 82 x=0; //x作为余数储存 83 for(i=1;i<=a[0]+20;i++) //按位相除 84 { 85 c[i]=(x*10+a[i])/bnum; 86 x=(x*10+a[i])%bnum; 87 } 88 89 //这里收敛掉0 90 len=a[0]+20; 91 while(c[1]==0&&len>21)// 92 { 93 for(i=1;i<=len;i++) //整体往前移一位 94 { 95 c[i]=c[i+1]; 96 } 97 len--; 98 } 99 for(i=1;i<=len-20;i++) 100 printf("%d",c[i]); 101 printf("."); 102 for(i=len-19;i<=len;i++) 103 printf("%d",c[i]); 104 }