Java的一些习题


目录

二进制序列问题

递归求解汉诺塔问题

求斐波那契数列的第n项。(迭代实现)


二进制序列问题

获取一个数二进制序列中所有的奇偶数位, 分别输出二进制序列

import java.util.Scanner;
//获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
public class Test {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入一个整数");
        StringBuilder evenBits = new StringBuilder(); // 存储偶数位
        StringBuilder oddBits = new StringBuilder();//奇数位
        int x = scan.nextInt();
        int count = 0;
        StringBuilder binaryString = new StringBuilder();
        while(x > 0){
            int tem = 0;
            tem = x;
            tem %=2;
            binaryString.append(tem);
            x /= 2;
            count++;
        }
        System.out.println(count);
        binaryString.reverse().toString();
        String reversedBinaryString = new StringBuilder(binaryString).reverse().toString();
        System.out.println(binaryString);
        for (int i = 0; i < count; i++) {
            if (i % 2 == 0) { // 偶数位
                evenBits.append(reversedBinaryString.charAt(i));
            } else { // 奇数位
                oddBits.append(reversedBinaryString.charAt(i));
            }
        }
        System.out.println("偶数位组成的二进制序列: " + evenBits.reverse());
        System.out.println("奇数位组成的二进制序列: " + oddBits.reverse());
    }
}

 简易方法:检测num中某一位是0还是1的方式:将num向右移动i位。’将移完位之后的结果与1按位与,如果:结果是0,则第i个比特位是0;结果是非0,则第i个比特位是1。

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    //0000 0010
    for (int i = 31; i >= 1 ; i-=2) {
        System.out.print(((n>>>i) & 1) + " " );
    }
    System.out.println();
    for (int i = 30; i >= 0 ; i-=2) {
        System.out.print(((n>>>i) & 1) + " " );
    }
}
递归求解汉诺塔问题

汉诺塔问题的基本描述如下:

有三根柱子(A、B、C),在A柱上有若干个盘子,这些盘子大小不同,大盘在下,小盘在上。目标是将所有盘子从A柱移动到C柱,并且每次只能移动一个盘子,且任何时候都不能将较大的盘子放在较小的盘子之上。

递归思路

解决汉诺塔问题的关键在于将其分解为更小的子问题。假设我们有n个盘子需要从A柱移动到C柱,我们可以按照以下步骤进行:

  1. 将上面的n-1个盘子从A柱移动到B柱(借助C柱作为辅助)。

  2. 将第n个(最大的)盘子从A柱移动到C柱。

  3. n-1个盘子从B柱移动到C柱(借助A柱作为辅助)。

这个过程本身就是递归的,因为移动n-1个盘子的问题与原问题相同,只是规模更小。

public class Test {
    public static void main(String[] args) {
        int n = 3; // 盘子的数量
        solveHanoi(n, 'A', 'C', 'B');
    }
    public static void solveHanoi(int n, char source, char target, char auxiliary) {
        if (n == 1) {
            System.out.println("Move disk 1 from " + source + " to " + target);
            return;
        }
        solveHanoi(n - 1, source, auxiliary, target);
        System.out.println("Move disk " + n + " from " + source + " to " + target);
        solveHanoi(n - 1, auxiliary, target, source);
    }
}
求斐波那契数列的第n项。(迭代实现)

斐波那契数列的定义

斐波那契数列的每一项是前两项的和。数列通常从两个初始值开始:

  • F(0) = 0

  • F(1) = 1

对于所有的 n ≥ 2,后续的项由以下递推关系定义:

  • F(n) = F(n-1) + F(n-2)

public class Test{
    //求斐波那契数列的第n项。(迭代实现)
    public static int fit(int n){
      if(n == 1){
          return 0;
      }
      if(n == 2){
          return 1;
      }
      int f1 = 0;
      int f2 = 1;
      int f3 = -1;
      for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
      }
      return fit(n - 1) +fit(n - 2);
    }
    public static void main(String[] args) {
        int x = 30;
        System.out.println(fit(x));
    }
}

你可能感兴趣的:(Java,java)