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


      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 } 
  • 相关阅读:
    010-你觉得单元测试可行吗
    跳台阶
    斐波那契数列
    旋转数组的最小数字
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    二维数组中的查找
    Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4363612.html
Copyright © 2020-2023  润新知