2014-08-30 68 views
3

我有權代表多項式作爲arrayslist.How從一個txt文件,看起來像這樣如何將字符串轉換爲多項式並添加或減去它們?

P1;5;3;-4;1;8;0 
P2;6;5;-2;2;7;1;-4;0 

接受輸入並把它變成一個多項式看起來像這樣

P1(X) = 5X^3 –4X +8 
P2(X) = 6X^5 -2X^2 +7X -4. 

怎麼可能我解決這兩個多項式之間的加法和減法問題?如P1 + P2

這裏是我有:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Scanner; 


public class PolyProcessor { 
    static int polyNum = 0; 
public static void main(String[] args) throws FileNotFoundException{ 

    PolyCalc c = new PolyCalc(); 
    File polyfile = new File("polyinput.txt"); 
    Scanner read = new Scanner(polyfile); 
    while (read.hasNextLine()){ 
     String j = read.nextLine(); 
     c.add(j); 
     } 


    } 
    } 


class PolyCalc{ 
    static int polyCount = 0; 

    static ArrayList polynomials = new ArrayList(); 

    static void add(String j){ 

     polynomials.add(j); 
     polyCount++;} 

    static Object get(int i){ 
     return polynomials.get(i);} 


    } 
+1

這並不像您想象的那麼容易。如果它是家庭作業,那麼創建自己的類來解析字符串並創建多項式的抽象表示。否則,找一個處理這個的庫。 – 2014-08-30 15:44:24

+0

我已經嘗試將它們轉換成字符串,但之後我很無能。我閱讀了它們,但在分隔它們之後不知道如何使用它們。我怎麼能做一個未定義的變量數學。然後我必須添加或減去所有單獨的數字也許?我只讀過它們並將它們放入數組列表中。 – Dave 2014-08-30 15:45:03

+0

我如何進行表示? – Dave 2014-08-30 15:47:53

回答

0

我能想到的最簡單的辦法是給係數存儲在數組中,並讓數組的索引對應的x長期的權力。這樣的陣列:

{2, 4, -1, 1}

將轉化爲:

x^3 - x^2 + 4x + 2

然後添加和減法將僅僅是將對應的索引的兩個陣列之間,並且將結果存儲在一個的事新陣列。你也必須跟蹤多項式的最高次項,這樣你才能知道如何做出表示它的數組。因此,訂單n的多項式將有一個大小爲n + 1的數組來表示它。

+0

你是如何做出這個數組的翻譯到那? – Dave 2014-08-30 15:56:20

+0

@Dave它是一個抽象表示... – 2014-08-30 15:57:09

+2

將數組乘以'x'的數字乘以數組中該數字的索引的冪。例如,數組中的'-1'索引爲'2',所以它變爲'-1 * x^2',或者簡單地爲'-x^2'。 – jackarms 2014-08-30 15:58:01

1

下面是有關如何實現多項式一個想法:基於對polynomial定義

在數學中,多項式是由變量(或不定元)和係數的表達,這是僅涉及加法,減法,乘法和非負整數指數的操作。

所以,你可以通過減少問題的一個術語開始:

class Term { 
    //making it immutable 
    final double power; 
    final double coefficient; 
    final String variable; 
    //constructor 
    public Term(double power, double coefficient, String variable) { 
     //assign variables and such 
     this.power = power; 
     //... 
    } 
    //getters for your class 
} 

現在,創建一個Polynomial類的術語的List並定義必要的方法來添加和刪除方面:

class Polynomial { 
    final String variable; 
    List<Term> terms; 
    public Polynomial(String variable) { 
     //this will allow you to accept only "X" or "Y" or terms with this variable only 
     this.variable = variable; 
     terms = new ArrayList<Terms>(); 
    } 
    public void add(Term term) { 
     /* 
      implement this... 
     */ 
    } 
} 

有了這個基本的模型,你可以想出更多的想法來增強設計。例如,Term可以實現​​以支持術語之間的比較,類似於Polynomial和其他元素。

2

多項式加法如何工作?

答案: - 通過添加相同的功率的係數

SO P1 = 5X^3 - 4X + 8

和P2 = 6X^5 -2X^2 + 7X^1 + -4

變得

P1 = 0X^5 + 5X^3 + 0X^2 - 4X^1 + 8X^0

P2 = 6X^5 + 0X^3 -2X^2 + 7X^1 - 4X^0

____________________________________

SUM = 6X^5 + 5X^3 -2X^2 + 3X^1 + 4X^0

____________________________________

您可以將電源作爲重點和係數的值在Map.Then迭代的地圖,並添加係數的值

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Scanner; 

class SumOfPolynomials { 

/** 
* @param args 
* @throws FileNotFoundException 
*/ 
public static void main(String[] args) throws FileNotFoundException { 

    List<Map<Integer, Integer>> listOfPolynomials = new ArrayList<Map<Integer, Integer>>(); 
    File polyfile = new File("polyinput.txt"); 
    Scanner read = new Scanner(polyfile); 
    while (read.hasNextLine()){ 
     String LINE = read.nextLine(); 
     String[] lineSpillted =LINE.split(";"); 
     Map<Integer, Integer> poynomial = new HashMap<Integer, Integer>(); 
     for(int i =1;i<lineSpillted.length-1;i=i+2){    //i starts from ignores P1,P2 etc 

      poynomial.put(Integer.parseInt(lineSpillted[i+1]), Integer.parseInt(lineSpillted[i])); 

     } 
     listOfPolynomials.add(poynomial); 
     } 

    read.close(); 

    Map<Integer, Integer> result = polynomialSum(listOfPolynomials.get(0), listOfPolynomials.get(1)); 

    if(listOfPolynomials.size()>2){ 

     for(int i=2;i<listOfPolynomials.size()-1;i++){ 

      result = polynomialSum(result,listOfPolynomials.get(i)); 
     } 
    } 
    // print out the SUM as VALUEX^KEY 
    System.out.println(); 
    int c = 0; 
    for (Map.Entry<Integer, Integer> entry : result.entrySet()) { 

     System.out.print(entry.getValue() + "X^" + entry.getKey()); 
     c++; 
     if (c != result.size()) { 
      System.out.print("+"); 
     } 
    } 

} 

public static Map<Integer, Integer> polynomialSum(Map<Integer, Integer> arg1, 
     Map<Integer, Integer> arg2) { 

    Map<Integer, Integer> SUM = new HashMap<Integer, Integer>(); 

    for (Map.Entry<Integer, Integer> entry : arg1.entrySet()) { 

     Integer power = entry.getKey(); 
     Integer coeff1 = entry.getValue(); 
     Integer coefficient; 
     if (arg2.containsKey(power)) { 
      coefficient = arg2.get(power) + coeff1; 
     } else { 
      coefficient = coeff1; 
     } 
     SUM.put(power, coefficient); 
    } 

    for (Map.Entry<Integer, Integer> entry : arg2.entrySet()) { 

     if (SUM.containsKey(entry.getKey())) { 
      continue; 
     } else { 
      SUM.put(entry.getKey(), entry.getValue()); 
     } 

    } 

    return SUM; 
} 

}

編輯的多個Polynomials.Multiple多項式在一個列表中加入,然後總和被計算通過遍歷列表

輸出: -

Output

+0

好吧,我做了,但我如何閱讀文件並添加或減去它們並返回輸出? – Dave 2014-08-30 17:01:40

+0

@dave我還沒有使用該類。只需檢查我的代碼 – 2014-08-30 17:05:26

+0

只需使用if(arg1.containsKey(power)){係數= arg1.get(power) - coeff1; } else { coefficient = -1 * coeff1; } – 2014-08-30 17:09:48

0

對不起,關於變量名沒有任何接近數學標準,也沒有經過測試,但這應該給你一些想法。

import java.util.ArrayList; 
public class Poly { 

    private String[] numbers; 
    private ArrayList<Variable> func; 

    public Poly(String poly, double valueOfX) { 
     numbers = poly.split(";"); 
     func = new ArrayList<>(); 
     for (int i = 1; i < numbers.length - 1; i+=2) { 
      double exp = (numbers[i+1] == "0") ? 1 : Double.parseDouble(numbers[i++]); 
      double x = (numbers[i+1] == "0") ? 1 : valueOfX; 
      func.add(new Variable(Double.parseDouble(numbers[i]), exp, x)); 
     } 
    } 

    public ArrayList<Variable> getFunc() { 
     return func; 
    } 

} 
public class Variable { 

    private double value; 
    private double exponent; 
    private double x; 

    public Variable(double value, double exponent, double x) { 
     this.value = value; 
     this.exponent = exponent; 
     this.x = x; 
    } 

    public double getValue() { 
     return value; 
    } 

    public double getExponent() { 
     return exponent; 
    } 

    public double getX() { 
     return x; 
    } 
} 

由此,您可以獲得想要的變量,並通過獲取數組列表的索引來計算值,併發揮一定的魔力。

+0

我剛剛意識到它會錯誤地評估最後一個數字,因爲任何0的冪都是1. – Hayden 2014-08-30 16:17:47

+0

那麼這是否將變量和係數和指數分開?它是否需要前3個字母pn1並將它們誤認爲整數? – Dave 2014-08-30 16:24:14

+0

@Dave我犯了一個錯誤,就是沒有在等式中加入x部分。我不是靠近編譯器來測試這個抱歉,但希望這可以工作。 – Hayden 2014-08-30 16:31:59

相關問題