zoukankan      html  css  js  c++  java
  • 大数据除法(Large data division)

    题目描述 Description
    除法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(足够大就可以啦O(∩_∩)O)的一个被除数,再给定一个long long类型的除数,求它的余数,并保留小数点后s位。
     输入输出格式 Input/output
    输入格式:
    三行:
    第一行:被除数
    第二行:除数
    第三行:一个数s,表示保留小数点后s位
    输出格式:
    第一行:表示计算的结果(不可以有前导0,保留小数点后s位)
    第二行:余数
     输入输出样例 Sample input/output
    样例测试点#1
    输入样例#1:
    123456789
    123
    30
    输出样例#1:
    1003713.731707317073170731707317073170
    90
    样例测试点#2
    输入样例#2:

    2456465461515648654411465465465413231256456445621
    15
    30

    输出样例#2:

    163764364101043243627431031031027548750430429708.066666666666666666666666666666
    1

    思路:这题的数据量很大,大数据类型的,如果直接计算是不可取的,必须用高精度算法。
    这里可以分为几个函数来计算:
    ①高精度除以单精度法函数:专题里面会细细地讲的
    倒序输出函数:专题里面会细细地讲的
    ③手算模拟了一下除法的过程,余数*10再除以除数,就得了第一位小数点后的数,保存到k里面,输出再把余数赋值为余数-除数*K(想不通的,可以手动模拟一下过程,其实很简单的)然后一位一位输出即可
    代码如下:
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MaxLength 99999 
     4 int x,q;//q是备份余数用的 
     5 void output(int c[])//倒序输出函数
     6 {
     7     int i;
     8     for(i=c[0];i>=1;i--)
     9         printf("%d",c[i]);
    10 }
    11 /*============================================================================*/
    12 void div(char strA[],int b,int c[])//高精度数a除以整数b,结果保存在c。
    13 {
    14     int a[MaxLength],i,lena,lenc,j,t;
    15     memset(a,0,sizeof(a));
    16     memset(c,0,sizeof(c));
    17     if(b==0) 
    18     {
    19         c[0]=1;
    20         c[1]=0;
    21         return ;
    22     }
    23     lena=strlen(strA);
    24     for(i=0;i<lena;i++)     //把串strA正序存储到数组a 
    25         a[i+1]=strA[i]-'0';    
    26     x=0;
    27     for(i=1;i<=lena;i++)   //按位相除 
    28     {
    29         c[i]=(x*10+a[i])/b;
    30         x=(x*10+a[i])%b; 
    31     }    
    32     lenc=1;
    33     while(c[lenc]==0&&lenc<lena)  //高位可能会有一些无意义的0,需要把lenc定好位 
    34         lenc++;    
    35     c[0]=lena-lenc+1;
    36     for(j=1;j<=c[0];j++) //把数组c整体左移,也就是把前缀0给覆盖掉 
    37     {
    38         c[j]=c[lenc];
    39         lenc++;
    40     }
    41     for(i=1,j=c[0];i<j;i++,j--)
    42     {
    43         t=c[i];c[i]=c[j];c[j]=t;
    44     }
    45     q=x;//备份一下余数 
    46     output(c);//传入输出函数
    47 }
    48 /*============================================================================*/
    49 int main()
    50 {
    51     char a[MaxLength];
    52     int b[MaxLength];
    53     int i,k;
    54     long long s,n;
    55     gets(a);
    56     scanf("%I64d",&n);
    57     scanf("%d",&s);
    58     div(a,n,b);
    59     printf(".");     
    60     for(i=0;i<s;i++)//小数点后s位 
    61     {
    62         x=x*10;
    63         k=x/n;
    64         printf("%d",k);
    65         x=x-n*k; 
    66     }
    67     printf("
    %d
    ",q); 
    68     return 0;
    69 }
  • 相关阅读:
    3.4.2内核下的I2C驱动
    AS3批量替换文件
    文件访问权限
    Windows快捷键
    整数与字符串之间的转换函数
    Windows获取文件大小
    Windows内核对象
    ASCII字符集
    IP协议
    获取真正的进程/线程句柄
  • 原文地址:https://www.cnblogs.com/geek-007/p/4356348.html
Copyright © 2011-2022 走看看