蓝桥杯历年真题题目及题解目录汇总
历届试题 小数第n位
时间限制:1.0s 内存限制:256.0MB
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个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
提供3种思路,暴力模拟,大数类divide,求循环节
网上很多代码过不了这个用例 7 15 1000000000,官网数据弱
import java.util.Scanner;
public class 小数第n位_暴力 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int n = in.nextInt();
int g = gcd(a,b);
a/=g;
b/=g;
int i=1,j=0;
while(i<=n+2) {
a*=10;
if(i>=n) {
System.out.print(a/b);
j++;
}
a%=b;
if(a==0) {
while(j++<3)
System.out.print(0);
break;
}
i++;
}
}
static int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class 小数第n位_优化 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int n = in.nextInt();
int g = gcd(a,b);
a/=g;
b/=g;
int count = 0;
ArrayList<Integer> list = new ArrayList<>();
// System.out.println((double)a/b);
while(--n>0) {
a*=10;
a%=b;
if(list.contains(a)) {
n = n%(count-list.indexOf(a));
// System.out.println(":"+(count-list.indexOf(a)));
}
else
list.add(a);
count++;
}
if(a==0)
System.out.println("000");
else {
a*=10;
System.out.print(a/b);
a%=b;
a*=10;
System.out.print(a/b);
a%=b;
a*=10;
System.out.println(a/b);
}
}
static int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
}
解决之道:就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)
BigDecimal定义了一下舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,下面简单介绍,详细请查阅J2se API文档
static int | ROUND_CEILING Rounding mode to round towards positive infinity. 向正无穷方向舍入 |
static int | ROUND_DOWN Rounding mode to round towards zero. 向零方向舍入 |
static int | ROUND_FLOOR Rounding mode to round towards negative infinity. 向负无穷方向舍入 |
static int | ROUND_HALF_DOWN Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 |
static int | ROUND_HALF_EVEN Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN |
static int | ROUND_HALF_UP Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 |
static int | ROUND_UNNECESSARY Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 计算结果是精确的,不需要舍入模式 |
static int | ROUND_UP Rounding mode to round away from zero. 向远离0的方向舍入 |