java-A-8带分数

带分数

方法一

首先对这10个数字进行全排列,再对全排列后的数中加上+/判断该数是否符合题意。

  • 必须要掌握全排列的方法(递归)。
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改

public class Main {
	static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	static int ans;
	static int n;
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		// 在此输入您的代码...
		n = scan.nextInt();

		f(0);
		System.out.println(ans);
		scan.close();
	}

	// 确认某一个排列的第K位
	private static void f(int k) {
		if (k == 9) { // 全部确认
			check(arr);
//			print(arr);

		}

		// 选定第 k 位
		for (int i = k; i < arr.length; i++) {
			// 将第 i 位和第 k位交换
			int t = arr[i];
			arr[i] = arr[k];
			arr[k] = t;

			// 移交下一层 确认 k+1位
			f(k + 1);

			// 回溯(换回来)
			t = arr[i];
			arr[i] = arr[k];
			arr[k] = t;
		}

	}

	private static void print(int[] arr) {
		// TODO Auto-generated method stub
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
		}
		System.out.println();
	}

	// 枚举 + 和 / 的位置
	private static void check(int[] arr) {
		// + 前的字符数量最多是7
		for (int i = 1; i <= 7; i++) {
			// / 前面的字符数最少是 i+1
			int num1 = toInt(0,i); // + 前面的数字
			if (num1 >= n) { // 如果 + 前的数 大于 n 就没有必要再往下算了
				break;
			}
			for (int j = 1; j <= 8-i ; j++) {
				int num2 = toInt(i, j);
				int num3 = toInt(i+j, 9-i-j);
				if (num2 % num3 == 0 && num1 + num2 / num3 == n) {
					ans++;
				}
			}
		}
	}

	private static int toInt(int pos, int len) {
		int t = 1;
		int ans = 0;
		for (int i = pos+len-1; i >= pos; i--) {
			ans+=arr[i]*t;
			t*=10;
		}
		return ans;
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值