Zmiana inputu

This commit is contained in:
Krystian Madra 2018-06-07 08:27:00 +00:00
parent 9d1452fa16
commit 42bc4ae122

View File

@ -1,282 +1,343 @@
//package com.madrakrystian.algebra; //package com.madrakrystian.algebra;
import java.util.Arrays; import java.io.BufferedReader;
import java.util.Scanner; import java.io.IOException;
import java.io.StringReader;
public class MainApp { import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
// Napisać program, który dla danego pierścienia współczynników R = /n, n oraz wielomianów f,g R[x] zmiennej x znajdzie:
// public class MainApp {
// iloczyn fg R[x]
// klasę reszty f R[x]/(g)
// największy wspólny dzielnik nwd(f,g) korzystając z algorytmu Euklidesa. // Napisać program, który dla danego pierścienia współczynników R = /n, n oraz wielomianów f,g R[x] zmiennej x znajdzie:
// //
// Uwaga: wielomiany podawane jako ciąg współczynników od wyrazu wolnego, do współczynnika wiodącego. // iloczyn fg R[x]
// // klasę reszty f R[x]/(g)
// Termin: 07.06 // największy wspólny dzielnik nwd(f,g) korzystając z algorytmu Euklidesa.
// Przykłady: //
// // Uwaga: wielomiany podawane jako ciąg współczynników od wyrazu wolnego, do współczynnika wiodącego.
// Input: 2, [1,1,1,0,1], [0,1,1] (i.e. f = 1 + x + x² + x, g = x² + x) //
// Output: [[0,1,0,0,1,1,1], [1,1], [1,1]] // Termin: 07.06
// // Przykłady:
// Input: 6, [2,1,0,2,1,3], [1,0,0,5] //
// Output: [[3,1,0,5,0,1,4,5,5], [5,2,1], DivisionError] // Input: 2, [1,1,1,0,1], [0,1,1] (i.e. f = 1 + x + x² + x, g = x² + x)
// Output: [[0,1,0,0,1,1,1], [1,1], [1,1]]
//
// Input w programie dla przykladu 1 // Input: 6, [2,1,0,2,1,3], [1,0,0,5]
// Podaj n: // Output: [[3,1,0,5,0,1,4,5,5], [5,2,1], DivisionError]
// 2
// Pierwszy wielomian:
// Podaj liczbe wyrazow w wielomianie: // czytanie inputu z System.in
// 5 static Scanner reader = new Scanner(System.in);
// Podaj kolejne wyrazy wielomianu po przycisku enter
// 1 public static void main(String[] args) {
// 1
// 1 // liczniki indeksow wielomianow
// 0 int counterFirst = 0, counterSecond = 0;
// 1
// Drugi wielomian: // wielomiany + pomocniczme stosy
// Podaj liczbe wyrazow w wielomianie: int polyOne[];
// 3 Stack<Integer> p1 = new Stack<Integer>();
// Podaj kolejne wyrazy wielomianu po przycisku enter int polyTwo[];
// 0 Stack<Integer> p2 = new Stack<Integer>();
// 1
// 1 // wspolczynnik n
int n=1;
// czytanie inputu z System.in String str;
static Scanner reader = new Scanner(System.in); String input;
public static void main(String[] args) { char temp;
// wielomiany //
int polyOne[]; // poprawiony bardzo nieelegancki nowy input
int polyTwo[]; //
// wspolczynnik n input = reader.nextLine();
int n=1;
BufferedReader read = new BufferedReader(
//input new StringReader(input));
do{
System.out.println("Podaj n: "); // od poczatku pierwszego wielomianu '['
// wpisz liczbe int i = 3;
n = reader.nextInt(); try {
if ((str = read.readLine()) != null) {
}while(n > 1000 || n <= 0);
if (str.length() > 0) {
n = Character.getNumericValue(str.charAt(0));
System.out.println("Pierwszy wielomian: "); }
polyOne = fillPolynomial(); temp = str.charAt(i);
while(temp != ']') {
System.out.println("Drugi wielomian: ");
polyTwo = fillPolynomial(); if(temp != ',') {
p1.push(Character.getNumericValue(temp));
// wyswietl wielomiany counterFirst++;
System.out.println("f:" + Arrays.toString(polyOne)); }
System.out.println("g:" + Arrays.toString(polyTwo)); i++;
temp = str.charAt(i);
// 1. }
System.out.println("1. iloczyn f*g: ");
int res[] = modTheTab(polynomialsMultiplication(polyOne, polyTwo),n); // przejscie do drugiej tablicy (zakladamy ze wielomiany oddzielone sa spacja)
System.out.println(Arrays.toString(res)); i += 3;
temp = str.charAt(i);
// 2.
System.out.println("2. klasa reszty: "); while(temp != ']') {
res = polynomialsDivide(polyOne,polyTwo,n);
System.out.println(Arrays.toString(res)); if(temp != ',') {
p2.push(Character.getNumericValue(temp));
// 3. counterSecond++;
System.out.println("3. nwd: "); }
res = nwd(polyOne,polyTwo,n); i++;
System.out.println(Arrays.toString(res)); temp = str.charAt(i);
}
reader.close();
} // inicjalizacja tablic
polyOne = new int[counterFirst];
polyTwo = new int[counterSecond];
// uzupelnianie tablicy
public static int[] fillPolynomial() { // wypelnianie tablic
for(int j=polyOne.length-1; j>=0; j--) {
// zmienna pomocnicza
int temp = 0; polyOne[j] = p1.pop();
}
System.out.println("Podaj liczbe wyrazow w wielomianie: ");
temp = reader.nextInt(); for(int j=polyTwo.length-1; j>=0; j--) {
polyTwo[j] = p2.pop();
int[] tab = new int[temp]; }
// uzupelnianie pierwszego wielomianu
System.out.println("Podaj kolejne wyrazy wielomianu po przycisku enter"); // wyswietl wielomiany
System.out.println("f:" + Arrays.toString(polyOne));
for(int i=0; i<tab.length; i++){ System.out.println("g:" + Arrays.toString(polyTwo));
temp = reader.nextInt(); // 1.
System.out.println("1. iloczyn f*g: ");
tab[i] = temp; int res[] = modTheTab(polynomialsMultiplication(polyOne, polyTwo),n);
} System.out.println(Arrays.toString(res));
return tab;
} // 2.
System.out.println("2. klasa reszty: ");
// dzielenie modulo tablicy res = polynomialsDivide(polyOne,polyTwo,n);
public static int[] modTheTab(int tab[], int mod) { System.out.println(Arrays.toString(res));
for(int i=0; i<tab.length; i++) { // 3.
tab[i] = tab[i] % mod; System.out.println("3. nwd: ");
} res = nwd(polyOne,polyTwo,n);
return tab; System.out.println(Arrays.toString(res));
}
reader.close();
// 1. mnozenie wielomianow }
public static int[] polynomialsMultiplication(int polyOne[], int polyTwo[]) {
} catch(IOException e) {
// suma dlugosci e.printStackTrace();
int amount = polyOne.length + polyTwo.length; }
// nowa tablica bedzie dlugosci sumy poteg wyrazow wiodacych obu tablic -1 //input(old)
int result[] = new int[amount-1]; /*
do{
// wypelnienie nowej tablicy zerami System.out.println("Podaj n: ");
for(int i=0; i<result.length; i++) { // wpisz liczbe
result[i] = 0; n = reader.nextInt();
}
// mnozenie }while(n > 1000 || n <= 0);
for(int i=0; i<polyOne.length; i++) {
for(int j=0; j<polyTwo.length; j++) { System.out.println("Pierwszy wielomian: ");
result[i+j] += polyOne[i] * polyTwo[j]; polyOne = fillPolynomial();
}
} System.out.println("Drugi wielomian: ");
return result; polyTwo = fillPolynomial();
} */
public static int[] polynomialMultiplication(int poly[], int number) {
reader.close();
for(int i=0; i<poly.length; i++) { }
poly[i] *= number;
}
// uzupelnianie tablicy
return poly; public static int[] fillPolynomial() {
}
// zmienna pomocnicza
public static int[] polynomialsSubstraction(int polyOne[], int polyTwo[]) { int temp = 0;
int result[] = Arrays.copyOf(polyOne, polyOne.length); System.out.println("Podaj liczbe wyrazow w wielomianie: ");
temp = reader.nextInt();
// wypelnienie tablicy zerami
for(int i=0; i<result.length; i++) { int[] tab = new int[temp];
result[i] = 0;
} // uzupelnianie pierwszego wielomianu
System.out.println("Podaj kolejne wyrazy wielomianu po przycisku enter");
for(int i=0; i<polyOne.length; i++) {
result[i] = polyOne[i] - polyTwo[i]; for(int i=0; i<tab.length; i++){
}
temp = reader.nextInt();
return result;
} tab[i] = temp;
}
public static int multiplier(int lo, int lt, int mod) { return tab;
}
for(int i=0; i<mod; i++) {
if(lo == (lt*i) % mod) { // dzielenie modulo tablicy
return i; public static int[] modTheTab(int tab[], int mod) {
}
} for(int i=0; i<tab.length; i++) {
tab[i] = tab[i] % mod;
// error }
return -1; return tab;
} }
public static int[] polynomialShift(int poly[], int places) { // 1. mnozenie wielomianow
public static int[] polynomialsMultiplication(int polyOne[], int polyTwo[]) {
// jesli przesunac w lewo o 0 to kopiuj tablice
if(places == 0) { // suma dlugosci
int[] res = Arrays.copyOf(poly, poly.length); int amount = polyOne.length + polyTwo.length;
return res;
} // nowa tablica bedzie dlugosci sumy poteg wyrazow wiodacych obu tablic -1
// bardzo brzydkie przesuwanie int result[] = new int[amount-1];
else {
int[] res = new int[poly.length]; // wypelnienie nowej tablicy zerami
for(int i=0; i<result.length; i++) {
for(int i=0; i<poly.length-places; i++) { result[i] = 0;
res[i] = poly[i+places]; }
} // mnozenie
for(int i=0; i<polyOne.length; i++) {
for(int j=poly.length - places + 1; j<res.length; j++) {
res[j]=0; for(int j=0; j<polyTwo.length; j++) {
} result[i+j] += polyOne[i] * polyTwo[j];
}
return res; }
} return result;
} }
//2. Dzielenie wielomianow public static int[] polynomialMultiplication(int poly[], int number) {
public static int[] polynomialsDivide(int polyOne[], int polyTwo[], int mod) {
for(int i=0; i<poly.length; i++) {
// druga tablica ale z rowna liczba indeksow co pierwsza poly[i] *= number;
int[] tempTab = new int[polyOne.length]; }
// output
int[] result; return poly;
}
// wypelnienie tablicy zerami
for(int i=0; i<tempTab.length; i++) { public static int[] polynomialsSubstraction(int polyOne[], int polyTwo[]) {
tempTab[i] = 0;
} int result[] = Arrays.copyOf(polyOne, polyOne.length);
// wypelnienie tablicy od konca elementami z konca drugiego wielomianu // wypelnienie tablicy zerami
for(int j=0; j<polyTwo.length; j++) { for(int i=0; i<result.length; i++) {
tempTab[tempTab.length - 1 - j] = polyTwo[polyTwo.length - 1 - j]; result[i] = 0;
} }
// stopnie wielomianow for(int i=0; i<polyOne.length; i++) {
int pod = polyOne.length-1; result[i] = polyOne[i] - polyTwo[i];
int ptd = polyTwo.length-1; }
// liczba przez ktora bedziemy mnozyc tablice return result;
int temp,i=0; }
// dopóki wielomian w ostatnim rzędzie nie będzie stopnia mniejszego niż stopień dzielnika public static int multiplier(int lo, int lt, int mod) {
while(pod >= ptd) {
for(int i=0; i<mod; i++) {
// modulo dla ujemnych
if(polyOne[pod]<0) { if(lo == (lt*i) % mod) {
polyOne[pod] = mod + polyOne[pod]; return i;
} }
}
// szukany mnoznik
temp = multiplier(polyOne[pod], polyTwo[ptd], mod); // error
return -1;
// przesuniecie tablicy }
tempTab = polynomialShift(tempTab,i);
public static int[] polynomialShift(int poly[], int places) {
// mnozenie wielomianow
tempTab = polynomialMultiplication(tempTab, temp); // jesli przesunac w lewo o 0 to kopiuj tablice
if(places == 0) {
tempTab = modTheTab(tempTab, mod); int[] res = Arrays.copyOf(poly, poly.length);
return res;
// odejmowanie wielomianow }
polyOne = polynomialsSubstraction(polyOne,tempTab); // bardzo brzydkie przesuwanie
else {
// zmiejszamy stopien pierwszego wielomianu int[] res = new int[poly.length];
pod--;
for(int i=0; i<poly.length-places; i++) {
// zwiekszamy liczbe przesuniec drugiej tablicy res[i] = poly[i+places];
i++; }
} for(int j=poly.length - places + 1; j<res.length; j++) {
result = Arrays.copyOf(polyOne, i-1); res[j]=0;
}
return result;
} return res;
}
// 3. }
public static int[] nwd(int polyOne[], int polyTwo[], int mod) {
if(polyTwo.length == 0) { //2. Dzielenie wielomianow
return polyOne; public static int[] polynomialsDivide(int polyOne[], int polyTwo[], int mod) {
}
return nwd(polyTwo, polynomialsDivide(polyOne,polyTwo,mod),mod); // druga tablica ale z rowna liczba indeksow co pierwsza
} int[] tempTab = new int[polyOne.length];
// output
int[] result;
// wypelnienie tablicy zerami
for(int i=0; i<tempTab.length; i++) {
tempTab[i] = 0;
}
// wypelnienie tablicy od konca elementami z konca drugiego wielomianu
for(int j=0; j<polyTwo.length; j++) {
tempTab[tempTab.length - 1 - j] = polyTwo[polyTwo.length - 1 - j];
}
// stopnie wielomianow
int pod = polyOne.length-1;
int ptd = polyTwo.length-1;
// liczba przez ktora bedziemy mnozyc tablice
int temp,i=0;
// dopóki wielomian w ostatnim rzędzie nie będzie stopnia mniejszego niż stopień dzielnika
while(pod >= ptd) {
// modulo dla ujemnych
if(polyOne[pod]<0) {
polyOne[pod] = mod + polyOne[pod];
}
// szukany mnoznik
temp = multiplier(polyOne[pod], polyTwo[ptd], mod);
// przesuniecie tablicy
tempTab = polynomialShift(tempTab,i);
// mnozenie wielomianow
tempTab = polynomialMultiplication(tempTab, temp);
tempTab = modTheTab(tempTab, mod);
// odejmowanie wielomianow
polyOne = polynomialsSubstraction(polyOne,tempTab);
// zmiejszamy stopien pierwszego wielomianu
pod--;
// zwiekszamy liczbe przesuniec drugiej tablicy
i++;
}
result = Arrays.copyOf(polyOne, i-1);
return result;
}
// 3.
public static int[] nwd(int polyOne[], int polyTwo[], int mod) {
if(polyTwo.length == 0) {
return polyOne;
}
return nwd(polyTwo, polynomialsDivide(polyOne,polyTwo,mod),mod);
}
} }