任务描述:
输入一个 10 进制正整数n(取值范围:0<n<1000),然后输出它所对应的八进制(要求用模除取余,不得直接转换输出)
任务要求:
十进制数转八进制数的思想:
十进制数转八进制数的思想主要基于“除基取余”法,也称为“倒序取余”法。具体步骤如下:
- 整数部分转换:
-
- 用待转换的十进制数连续除以基数8,每次都取余数。
- 第一次除得的余数,是转换后的八进制数的最低有效位(个位)。
- 继续除以8,第二次的余数是次低位,依此类推,直至商为0为止。
- 将所有余数从最后一次到第一次(也就是从低位到高位)排列起来,就得到了转换后的八进制数。
- 小数部分转换(如果存在):
-
- 对于小数部分,转换方法类似于二进制转十进制中的乘基取整法。
- 小数部分连续乘以8,每次取乘积的整数部分,直到乘积的小数部分消失或达到预设精度为止。
- 所得到的整数序列从左到右排列即为小数点后的八进制数位。
举例来说,将十进制数136转换为八进制数的过程如下:
- 136 ÷ 8 = 17 ... 0 (余数0)
- 17 ÷ 8 = 2 ... 1 (余数1)
- 2 ÷ 8 = 0 ... 2 (余数2)
于是,从后往前读取余数,得到的八进制数是210。
整个过程可以用迭代或递归的方式来编程实现,也可以利用栈数据结构的特点,模拟“倒序取余”的过程。在实际编程中,特别是使用栈思想时,会将每次的余数压入栈内,最后弹出栈内元素即可得到从高位到低位的八进制数位。
代码示例:
package march0317_0331;
import java.util.Scanner;
public class March0318 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个十进制正整数(0 < n < 1000):");
int num = scanner.nextInt();
// 验证输入是否在指定范围内
if (num >= 0 && num < 1000) {
System.out.println("转换成八进制为:" + method(num));
} else {
System.out.println("错误!输入值超出范围,请确保0 < n < 1000。");
}
}
// 转换函数,仅使用模除取余法实现
public static String method(int n) {
// StringBuilder对象
StringBuilder octalStr = new StringBuilder();
while (n > 0) {
// 将余数插入到字符串的开头
octalStr.insert(0, n % 8);
// 除以8,得到新的余数
n /= 8;
}
// 返回结果
return octalStr.toString();
}
}