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

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

来自一名招聘者的灵魂拷问,第一次写,写了好久。先不说了上代码。
方法一:
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("****");
    

    }

}

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

猜你喜欢

转载自blog.csdn.net/weixin_43618209/article/details/96436872