• 周四. 4月 18th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

大数据除法(Large data division)

admin

11月 28, 2021
题目描述 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 }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注