java学习笔记3-带分数全排列(未完成)

2021/4/8 1:08:35

本文主要是介绍java学习笔记3-带分数全排列(未完成),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

带分数

试题 带分数
问题描述

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。
输入格式

从标准输入读入一个正整数N (N<1000*1000)
输出格式

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6

代码①(全排列):

import java.util.Scanner;

public class 带分数 {
	private static Scanner sc;
	private static int n,result;

	public static void main(String[] args) {
		sc = new Scanner(System.in);
		n = sc.nextInt();
		sc.close();
		
		int[] data= {1,2,3,4,5,6,7,8,9};//九个数的排列方法
		allsort(data,0);
		System.out.println(result);
	}

	private static void allsort(int[] data, int i) {
		// TODO Auto-generated method stub
		if(i==data.length) {
			
			for(int j=1;j<data.length;j++) {
				//对挑选出来的k-j个数字进行组合枚举出来,枚举三个,然后拿这三个书进行带分数公式来检验
				for(int k=j+1;k<data.length;k++) {//在每种整数占位方法的基础上,列举分数的占位方法
					int pre=split(data,0,j);
				    int mid=split(data,j,k);
				    int fon=split(data,k,9);
				    if(mid%fon!=0) //如果分数值已经大于输入数据,后面占位方法也肯定是大于的,直接结束
				    	continue;
				    if(pre+mid/fon==n)//如果结果与输入数据相等,有效排列+1
				    	result++;
				}
			}
			return;
		}
			for(int j=i;j<data.length;j++) {
				int temp=data[j];
				data[j]=data[i];
				data[i]=temp;
				
				allsort(data,i+1);//递归
				
				temp=data[j];
				data[j]=data[i];
				data[i]=temp;
			}
		}
	private static int split(int[] data, int j, int k) {//列举所有全排列
		// TODO Auto-generated method stub
		int num=0;
		for(int i=j;i<k;i++) {
			num=data[i]+num*10;
		}
		return num;
	}
}

全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
解法1(递归)
解法2(字典序法)
解法参考:https://blog.csdn.net/u013309870/article/details/68941284



这篇关于java学习笔记3-带分数全排列(未完成)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程