Java - пример программы - создание перестановок (математика)

Запустить код из командной строки можно по аналогии с этим примером.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class SimpleTokenizer {
	String delimiters = "\t\n\r+*-/() ";
	
/*Метод Tokenize возвращает массив, в котором содержатся полученные из строки str слова.
В строке delimiters содержатся символы, которые мы будем считать разделителями.*/
	String[] Tokenize(String str) {
		StringTokenizer st = new StringTokenizer(str, delimiters, true);
		String res[] = new String[st.countTokens()];
		int i = 0;
		while (st.hasMoreTokens()) {
			String a = st.nextToken();
			if(!a.startsWith(" ")) {
				res[i] = a;
				i++;
			}
		}
		String OutArr[] = new String[i];
		for(int j = 0; (j < i); j++)
			OutArr[j]=res[j];
		return OutArr;
	}

}

class PrinPer {
	void PrintPermutation(String str[]) {
		System.out.println("You have input the following permutation:");
		System.out.print("[ ");
		for(int i=1; (i <= str.length); i++) {
			System.out.print(i+" ");
		}	
		System.out.print("]\n[ ");
		for(int i=1; (i <= str.length); i++) {
			System.out.print("  ");
		}
		System.out.print("]\n[ ");
		for(String stroka: str) {
			System.out.print(stroka+" ");
		}
		System.out.println("]");
		System.out.println("And its cycle representation is");

		boolean satt[] = new boolean[str.length];
		for(int i=0; (i < satt.length); i++)
			satt[i] = true;

		int j=0;
		int k;
		for(int i=0; (i < str.length); i++) {
			if ( (satt[i]==true)&(Integer.parseInt(str[i])!=(i+1)) ) {
				System.out.print("( "+(i+1)+" ");
				satt[i]=false;
				k = Integer.parseInt(str[i]);
				while (satt[k-1]==true) {
					System.out.print(k+" " );
					satt[k-1]=false;
					k=Integer.parseInt(str[k-1]);
				}
				System.out.print(")");
			}
		}
		boolean b=true;
		for(boolean boolp: satt)
			b &= boolp;
		if (b) System.out.print("( 1 )");
		System.out.print("\n");
	}
	
}

class Permutation {
	public static void main (String args[]) throws java.io.IOException {

		SimpleTokenizer smtk = new SimpleTokenizer();
		PrinPer prpr = new PrinPer();
		System.out.println("Input all natural numbers from 1 to 9 (or less) in any order\nsetting spaces only between these numbers.");
		boolean ExitCode = true;
		String InputExpr;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in) );
		while (ExitCode) {			
			InputExpr = br.readLine();
			if ( InputExpr.equals("exit") )
				ExitCode = false;
			else {
				prpr.PrintPermutation(smtk.Tokenize(InputExpr));
				System.out.println("Input next permutation.");
 			}
		}
	}
}


Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

Кстати, если сдалать такой ввод (и подобные) - то появится ошибка:

Input all natural numbers from 1 to 9 (or less) in any order
setting spaces only between these numbers.
3 6 8 9 7
You have input the following permutation:
[ 1 2 3 4 5 ]
[ ]
[ 3 6 8 9 7 ]
And its cycle representation is
( 1 3 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at PrinPer.PrintPermutation(Permutation.java:58)
at Permutation.main(Permutation.java:89)

Вот такие дела)

_____________
матфак вгу и остальная классика =)