## 如何求小数点后的第n位??
** 如何求小数点后的第n位??**
笔者一开始想用循环,先对这个数字一直乘10,直到我们要求的小数点后那一位,之后对其取余即可。编程实现如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double a,b,n,m,i=10;
int j;
cin>>a>>b>>n;
m=a/b;
while(n)
{
m=m*i;
n--;
}
j=(int)m;
cout<<j%10;
}
但是一直时间超限emmm why?
由于计算机的储存空间有限,而这个while循环会一直乘10,会导致数据过大,计算机最大2^(8*8),所以最终的数据会储存不下,导致错误。
那我们只能换一个思路—模拟除法的使用,下面举几个例子:
在上图中,笔者将余数加粗了,本算法的实现即为用计算机实现手动的除法,a除以b的实质即为不断对余数乘10再做除法(在上图可以体现)。
设被除数是a,除数是b,由于求的是小数点后的第几位,我们不妨让a*10之后与b相除,这样运算一次即为第一位小数,这一步运算过后得到的余数继续乘10再继续除以b,得到第二位小数,以此类推。
下面即为模拟除法的代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c;
int n;
cin>>a>>b>>n;
while(n)
{
c=a*10/b;
a=(10*a)%b;
n--;
}
cout<<c;
}
通过做这个题我们主要明白计算机也不是万能的,有时候比较笨,储存不了太大的数据,(但是其实程序并没有漏洞,漏洞在于人的身上),我们必须不断寻找更简单更优化的方法去解决问题,同时也是自我提升的过程。
由于是第一次写,希望得到大家斧正,如果有别的思路或问题,很乐意与大家交流。