带小数的高精度除法(除以低精度数)

  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 } 

 

posted on 2015-03-24 18:15  Ricochet!  阅读(643)  评论(0编辑  收藏  举报