求整数除法小数点后的第n 位开始的 3 位数

​可以帮我看看哪里有问题吗,测试出来的结果都是对的。

题目描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。

如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。

本题的任务是:在上面的约定下,求整数除法小数点后的第n 位开始的 3 位数。

输入描述
输入一行三个整数:a b n,用空格分开。a 是被除数,b 是除数,n 是所求的小数后位置(0

输出描述
输出一行 3 位数字,表示:a 除以 b,小数后第 n 位开始的 3 位数字。

输入输出样例
示例
输入:
1 8 1
输出:
125

我的代码如下

import java.util.Scanner;
import java.lang.Math.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        double a,b,n;
        a=scan.nextDouble();
        b=scan.nextDouble();
        n=scan.nextDouble();
        //System.out.println(a/b);
        //System.out.println((a/b)*Math.pow(10.0,n+2));
        //System.out.println(1000*(int)((a/b)*Math.pow(10.0,n-1)));
        double temp=(a/b)*Math.pow(10.0,n+2)-1000*(int)((a/b)*Math.pow(10.0,n-1));
        System.out.println((int)temp);
        scan.close();
    }
}

如果是 有限小数的情况, 比如如下场景就不对了,你需要考虑这个场景:

img

参考如下:

import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a, b, n;
        a = scan.nextInt();
        b = scan.nextInt();
        n = scan.nextInt();
        int t = a % b;
        for (int i = 1; i < n + 3; i++) {
            if (i >= n) {
                System.out.print(t * 10 / b);
            }
            t = t * 10 % b;
        }
        scan.close();
    }
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您的代码看起来没有问题,对于给定的输入,输出也符合要求。总体上,您的程序实现了题目所要求的功能,计算了小数点后第 n 位开始的 3 位数字。

不过,我有几个小建议:

  1. 建议将变量 a、b、n 声明为整型,因为输入的是整数,转换为浮点数可能会损失精度。

  2. 建议使用 Scanner 的 nextInt() 方法读取整型输入,而不是 nextDouble() 方法,因为 nextDouble() 方法可能无法正确处理整数输入。

  3. 建议在 Scanner 使用完毕后及时关闭,以释放资源,避免内存泄漏。

  4. 建议在数学计算中使用常量,而不是硬编码的数字,以提高代码的可读性和可维护性。比如,可以定义一个常量 DIGITS = 3,表示需要输出的数字位数。

下面是按照上述建议修改后的代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        int n = scan.nextInt();
        int digits = 3;
        int temp = (int) ((a * 1000L / b % 1000) * Math.pow(10, n - digits) % 1000);
        System.out.println(String.format("%03d", temp));
        scan.close();
    }
}

这里使用了 long 类型的除法,避免了整数溢出的问题。注意在输出前使用 String.format() 方法来格式化输出,确保输出的数字是 3 位。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

题目不是已经说了吗?一行三个数字,空格隔开,你还接受三个输入怎么对

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/907790
  • 你也可以参考下这篇文章:实验7:1.输出数组元素:输入一个正整数n(1<n≤10),再输入数组a的n个整数,把a中所有的后项减前项之差存入数组b并按每行3个元素的格式输出数组元素b。 输入输出示例
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 5、汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,每次移动一个圆盘,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,柱子可以编号为A B C,编程输出n个圆盘从A柱子移动到C柱子的步骤。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 汉诺塔游戏:把所有盘子从A移动到C

    解题思路:
    (1)把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把第N个盘子由A柱子移动到C柱子上,那么剩下要移动的盘子在B柱子上了。
    (2)把B柱子上的前N-2个盘子借助C柱子,全部移动到A柱子上(过程暂不考虑),再把第N-1个盘子由B柱子移动到C柱子上。
    (3)重复上面的两个步骤即可把A柱子上的盘子全部移动到C柱子上。

    #include <stdio.h>
    void loveyou(int n, char start, char help, char end)
    {
    	if (n >= 2)
    	{
    		loveyou(n - 1, start, end, help);
    		printf("%c------>%c\n", start, end);
    		loveyou(n - 1, help, start, end);
    	}
    	else if (n == 1)
    	{
    		printf("%c------>%c\n", start, end);
    	}
    }
    int main(void)
    {
    	int n = 0;
    	printf("输入圆盘的数量:");
    	scanf("%d", &n);
    	loveyou(n, 'A', 'B', 'C');
    	return 0;
    }