本文主要是介绍2013省赛----带分数(对1~9的数字全排列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
import java.util.Scanner;public class TestOne {
//用到全排列static int ans; //得到数字N的可能组合数private static int N; //要得到的数字Npublic static void main(String[] args) {Scanner sc = new Scanner(System.in);N = sc.nextInt();//输入数字int[] arr = {1,2,3,4,5,6,7,8,9};//对该数组进行全排列f(arr,0);System.out.println(ans);}/*(1) 确认某一排列的第k位* */private static void f(int[] arr, int k) {//1.全部位置都已确认if(k==9) {check(arr);//验证该排列是否通过+、 \组合,得到数字Nreturn;}//2.选定第k位的元素for(int i=k;i<arr.length;i++) {//第k位可取的元素为 arr数组中 :第k到arr.length个元素//将第i位作为第k位元素。int t = arr[i];arr[i] = arr[k];arr[k] = t;//3.移交到下一层,去确认第k+1位f(arr,k+1);//4.回溯。换回来,便于后面的位置元素的确认t=arr[i];arr[i] = arr[k];arr[k] = t;}//for}/*(2)枚举 + 和\ 的位置* */private static void check(int[] arr) {//1.由于\在+的后面。所以+前面的数字最多有7位。for(int i=1;i<=7;i++) {//+前面可能的数字位数//2.获取+前面的数字,将这些数字转化为整数(0表示的是开始下标,i表示的是数字个数)int num1 = toInt(arr,0,i); //3.如果+前面的整数已经超过N,就没必要验算了if(num1>=N) {continue;}//4.计算+和\之间的数字个数(+和/中间最多有7位。 +前面至少有1位,\后面至少有1位)for(int j=1;j<=8-i;j++) {//4.1 将+和\之间的数字转化为整数(i表示开始下标,j表示数字个数)int num2 = toInt(arr, i, j);//4.2 获取\后面的数字(共9位数- 加号前的数字个数i - 加号和除号之间的数字位数j)int num3 = toInt(arr,i+j,9-i-j);//4.3 判断num1+num2/num3 = N 是否成立if((num2%num3==0) && (num1+num2/num3==N)) {ans++;}}//for}//for}/** (3)将一串数字转化为整数* arr: 存放一串数字* pos:开始下标* len:一串数字的长度* */private static int toInt(int[] arr, int pos, int len) {int t = 1;int result=0;for(int i=pos+len-1;i>=pos;i--) {result+=arr[i]*t;t=t*10;}return result;}}
这篇关于2013省赛----带分数(对1~9的数字全排列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!