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("\n");
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\n",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 }