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