题目
问题描述
给定一个整数 ( n ),生成一个序列。序列的第一个数是 ( n ),后面的每个数均是前一个数整除 2 的结果,直到结果为零为止。输出这个序列中所有大于零的项。
输入格式
输入一行,包含一个整数 ( n )。
输出格式
输出一行,包含多个整数,表示序列中所有大于零的项,相邻整数之间用一个空格分隔。
解题思路
要生成这样的序列,最直接的方法是从给定的整数 ( n ) 开始,不断将其除以 2,直到结果为 0 为止。每次除以 2 时,结果都保留在序列中。考虑到序列中的所有数都必须大于 0,所以在每次计算时要检查结果是否为正。
除法运算:每次将当前数除以 2。
停止条件:当结果为 0 时停止。
位移运算:右移操作 n >>= 1
可以用于快速计算除以 2 的结果。
位移运算
位移运算(Shift Operations)是一种对二进制数字进行操作的运算,常见的有 左移运算 和 右移运算。这类运算通过将数字的二进制形式向左或向右移动来改变其值,非常高效,尤其在涉及到乘法和除法时。
1. 左移运算(<<)
左移运算就是把一个数的二进制位向左移动一段距离,右边补上 0
,左边被移出去的部分直接丢掉。
公式: x << n
表示将 x
的二进制位向左移动 n
位。
效果: 对于正整数,左移相当于将数字乘以 2^n
。
例子: 假设我们有一个整数 5
,它的二进制表示是 101
。
-
如果我们做
5 << 1
(向左移动一位),就相当于在二进制末尾补0
:101 << 1
→1010
,这就是10
(十进制)。- 所以,
5 << 1 = 10
。
-
如果我们做
5 << 2
(向左移动两位),会变成:101 << 2
→10100
,这就是20
(十进制)。- 所以,
5 << 2 = 20
。
简单来说,左移 n 位相当于乘以 2^n
。比如左移一位就相当于乘以 2,左移两位就相当于乘以 4。
2. 右移运算(>>)
右移运算是把一个数的二进制位向右移动,左边用符号位(对于正数就是 0
,负数是 1
)来填补,右边被移出去的部分被丢掉。
- 公式:
x >> n
表示将x
的二进制位向右移动n
位。 - 效果: 对于正整数,右移相当于将数字除以
2^n
,并取整。
例子: 还是用 5
这个数,它的二进制表示是 101
。
-
如果我们做
5 >> 1
(向右移动一位),就相当于去掉最低位:101 >> 1
→10
,这就是2
(十进制)。- 所以,
5 >> 1 = 2
。
-
如果我们做
5 >> 2
(向右移动两位),会变成:101 >> 2
→1
,这就是1
(十进制)。- 所以,
5 >> 2 = 1
。
简单来说,右移 n 位相当于除以 2^n
并向下取整。右移一位相当于除以 2,右移两位相当于除以 4。
代码
import java.util.Scanner;
public class DivisibleSequence {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 输入整数 n
scanner.close();
StringBuilder result = new StringBuilder(); // 用于存储结果序列
while (n > 0) {
result.append(n).append(" "); // 将当前 n 添加到结果序列中
n >>= 1; // 右移一位,相当于 n 除以 2
}
System.out.println(result.toString().trim()); // 输出结果序列,去掉末尾的空格
}
}