题例:将一个正整数拆分成若干个正整数的和(来自一名招聘者的灵魂拷问)

it2022-05-05  147

题例:将一个正整数拆分成若干个正整数的和 第一次写这种算法,大概花了快两个小时吧。

来自一名招聘者的灵魂拷问,第一次写,写了好久。先不说了上代码。 方法一: package com.twelve.test;

import java.util.HashSet; import java.util.Scanner; import java.util.Set;

/**

@author 武 *2019年7月18日15:36:27 */ public class Demo02 {

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); System.out.println(toStr(calc(n))); }

public static Set calc(int n) { Set possibility = new HashSet(); Composition composition = new Composition(); switch (n) { case 1: composition.add(1); possibility.add(composition); return possibility; case 2: composition.add(1); composition.add(1); possibility.add(composition); return possibility; default: for (int i = 1; i <= n / 2; i++) { composition = new Composition(); composition.add(i); composition.add(n - i); possibility.add(composition); if (i <= n - i) { Set partial_pos = calc(n - i); for (Composition pos : partial_pos) { pos.add(i); possibility.add(pos); } } } return possibility; } }

public static String toStr(Set possibility) { String str = "total : " + possibility.size() + “\n”; for (Composition pos : possibility) str += toStr(pos); return str; }

public static String toStr(Composition composition) { String str = composition.get(0) + “”; for (int i = 1; i < composition.size(); i++) str += (" + " + composition.get(i)); str += “\n”; return str; }

}

package com.twelve.test;

import java.util.ArrayList; import java.util.Collections;

/**

@author 武 *2019年7月18日15:47:27 */ public class Composition extends ArrayList { @Override public boolean equals(Object other) { Composition comp = (Composition) other; Collections.sort(this); Collections.sort(comp); if (this.isEmpty() || comp.isEmpty() || this.size() != comp.size()) return false; for (int i = 0; i < this.size(); i++) { if (this.get(i) != comp.get(i)) return false; } return true; }

@Override public int hashCode() { return 0; } }

++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 此上该程序已写完。

方法二: 下面试刚听到例题之后的理解,当然 也可以实现,不过需要修改程序,增加输出即可。此方法比较繁琐,不适用于正式开发程序,望谨记,仅供参考。 package com.twelve.test;

import java.util.Random; import java.util.Scanner;

/**

@author 武 2019年7月18日15:32:00 */ public class Demo01 {

public static int[] getNL(int number, int size, int[] a) {

Random rand = new Random(); a = new int[size]; for (int i = 0; i < size - 1; i++) { int x = rand.nextInt(number);// 10以内,不填值默认为int类型之内 number = number - x; a[i] = x; } a[size - 1] = number;// 最后一个值,应该是前面随机之后,算出来的 return a;

}

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a[] = null; int b[] = null; int c[] = null; int d[] = null; int number = scanner.nextInt(); int size = scanner.nextInt(); a = getNL(number, size, a); b = getNL(number, size, b); for (int i = 0; i < number; i++) { c = getNL(number, size, c); d = getNL(number, size, d); }

for (int i : a) { System.out.print(i + "-"); } System.out.println("****"); for (int i : b) { System.out.print(i + "-"); } System.out.println("****"); for (int i : c) { System.out.print(i + "-"); } System.out.println("****"); for (int i : d) { System.out.print(i + "-"); } System.out.println("****");

}

}

控制台可以输出,测试,代码方面仅供参考,所有解释权谨归作者所有。


最新回复(0)