整数变换java代码

  • 问题描述:

关于整数i的变换f和g定义如下:f(n)=3*n;g(n)=[n/2];试设计一个算法,对于给定的两个整数n和m,用最少的f和g变换次数将n转化为m。

  • 算法设计:

对任意给定的整数n和m,计算将整数n转换成m所需要的最少变换次数。

  • 数据输入:

由文件input.txt给出输入数据。第一行有2个正整数n和m。

  • 结果输出:

将计算的最少变换次数以及相应的变换序列输出到文件output.txt。
文件的第一行是最少变换次数,第2行是相应的变换序列。
输入文件:
input.txt
15 4
output.txt
4
gfgg
循环样例:9 5

  • 思路:

可以当一个子集树,每次都有两种选择:g(n)和f(n);但是每次递归的n的值都是刚刚计算出来的新的值。

  • 剪枝函数:

如果n>=m,执行g(n)=[n/2]; 如果n<m,执行f(n)=3*n;
如果加了剪枝函数,就会使得求出来的只可能有一种情况,这种一定是最少变换次数。
子集树

import java.util.Scanner;

public class ZSBH {
	public static int m = -1;// 用于存放最后要变成的值
	public static int n = -1;// 用于存放刚开始的值
	public static char[] zt = new char[100];// 存放状态
	public static int[] zhi = new int[100];// 存放之前每一次计算的n的值,如果后面也出现了前面的值,就说明出现了死循环。
	public static int j = 0;// 来代表进入了第几次递归,从0开始
	
	public static void backtrack(int t) {
		int flag = 0;
		if(t == m) {
			System.out.println(t);
			for(int i = 0; i < zt.length; i++) { // 此处的zt.length可替换成j
				System.out.print(zt[i]+"  ");
			}
		}
		else {
			// 和之前的所有值比较,看是否出现重复
			for(int i = 0; i < zhi.length; i++) { // 此处的zt.length可替换成j
				if(zhi[i] == t) {
					System.out.println("重复了!");
					flag = 1;
					break;
				}
			}
			if(flag != 1) {
				zhi[j] = t;// 先把这次的值t存起来
				if(t < m) {
					t = 3 * t;
					zt[j++] = 'f';// 记下这一次执行的是什么
				}else {
					t = t / 2;
					zt[j++] = 'g';
				}
				backtrack(t);
			}
		}
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		m = input.nextInt();
		backtrack(n);
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果 m 是任意整数,则可以使用以下代码生成随机 m 行 n 列的随机整数矩阵,并进行初等行变换,转化为行阶梯形矩阵。 ```java import java.util.Random; public class RowReduction { public static void main(String[] args) { int m = 5; // 矩阵行数 int n = 6; // 矩阵列数 int[][] matrix = generateRandomMatrix(m, n); // 生成随机矩阵 System.out.println("原始矩阵:"); printMatrix(matrix); rowReduction(matrix); // 做初等行变换 System.out.println("行阶梯形矩阵:"); printMatrix(matrix); } // 生成随机矩阵 public static int[][] generateRandomMatrix(int m, int n) { int[][] matrix = new int[m][n]; Random rand = new Random(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { matrix[i][j] = rand.nextInt(10); } } return matrix; } // 打印矩阵 public static void printMatrix(int[][] matrix) { for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[0].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } System.out.println(); } // 做初等行变换 public static void rowReduction(int[][] matrix) { int lead = 0; int rowCount = matrix.length; int columnCount = matrix[0].length; for (int r = 0; r < rowCount; r++) { if (lead >= columnCount) { return; } int i = r; while (matrix[i][lead] == 0) { i++; if (i == rowCount) { i = r; lead++; if (lead == columnCount) { return; } } } int[] temp = matrix[r]; matrix[r] = matrix[i]; matrix[i] = temp; int lv = matrix[r][lead]; for (int j = 0; j < columnCount; j++) { matrix[r][j] /= lv; } for (int k = 0; k < rowCount; k++) { if (k != r) { int lv2 = matrix[k][lead]; for (int j = 0; j < columnCount; j++) { matrix[k][j] -= lv2 * matrix[r][j]; } } } lead++; } } } ``` 在上述代码中,我们仍然使用 generateRandomMatrix() 方法生成随机矩阵,printMatrix() 方法打印矩阵,rowReduction() 方法做初等行变换。这些方法的实现与之前的代码实现是一样的。 在 rowReduction() 方法中,我们同样使用高斯-约旦消元法将矩阵转化为行阶梯形矩阵。 这样,我们就可以生成任意行数的随机整数矩阵,并将其转化为行阶梯形矩阵。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值