问题描述:
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入格式
一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出格式
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
样例输入
1 8 1
样例输出
125
样例输入
1 8 3
样例输出
500
样例输入
282866 999000 6
样例输出
914
解题思路:
1.求出a%b(小数点后的数只跟余数有关)
2.余数末尾补0(乘10)后再除以除数b 求得的商为小数点后的数字 同时记录余数
3.重复步骤2 直到余数为0 或出现循环节为止 或已经求出了n+3位小数
注意这里我使用一个线性表来存储已计算出来过的余数,方便判断判断循环节((只要计算出的余数曾经出现过说明出现了循环节)和计算循环节的长度
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
int n=input.nextInt();
List<Integer> res=new ArrayList<>(); //保存小数点后的数字
List<Integer> list=new ArrayList<>(); //保存已计算过的余数
int mod=a%b,index=0; //index记录出现循环节的位置
while(mod!=0&&res.size()<n+2){
int temp=mod*10/b;
res.add(temp);
mod=mod*10%b;
int pos=list.indexOf(mod);
if(pos!=-1){
index=pos; //出现曾经计算过的余数 说明为无限循环小数(即循环节开始)
break;
}
list.add(mod); //存储余数
}
if(mod==0||res.size()>=n+2){
for(int i=0;i<3;i++){
if(n+i<=res.size())
System.out.print(res.get(n+i-1));
else
System.out.print(0);
}
}
else{
int len=list.size()-index; //计算循环节的长度
for(int i=0;i<3;i++){
if(n+i<=res.size())
System.out.print(res.get(n+i-1));
else
System.out.print(res.get((n+i-1-index)%len+index)); //根据循环节的长度和起始位置计算
}
}
}
}