蓝桥杯【历届试题 小数第n位】 java版 数论

历届试题 小数第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

 

import java.util.Scanner;

/**
 * 小数第n位 (带余除法)
 * @author Sylvia
 * 2019年3月3日
 */
public class Main{
	public static void main(String[] args) {
		//long startTime = System.currentTimeMillis(); //获取开始时间
		Scanner sc = new Scanner(System.in);
		long a = sc.nextLong();
		long b = sc.nextLong();
		long n = sc.nextLong();
		
		//余数
		long c = a % b;
		long tn = n;
		//计算几位数为一个循环
		int count = 0;
		
		while(--tn > 0) {
			if(c == 0) {
				break;
			}else {
				c *= 10;
				c = c % b;
			}
			count++;
			//因为除数都是一样的,所以当c % b == a % b时,出现循环
			if(c % b == a % b) {
				//从一个循环的第tn位开始计算
				tn = n % count; 
			}
		}
		
		if(tn > 0) {
			System.out.println("000");
		}else {
			for(int i = 0; i < 3; i++) {
				if(c == 0) {
					System.out.print(0);
				}else {
					c *= 10;
					System.out.print(c / b);
					c = c % b;
				}
			}
		}
		//long endTime = System.currentTimeMillis(); //获取结束时间
		//System.out.println("\n程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
	}
}



 

点赞