2017-09-08 12 views
0

私は、別々のリストでユーザーが与えた任意の多項式のべき乗と係数を得るために最善を尽くしました。別々のリストの多項式のべき乗と係数を取得する

基本的には、係数部分のみが使用され、パワー部分は使用されませんが、出力のリストは比較のためにのみ使用されます。私はそれをやったし、それは動作しますが、コードは控えめで非エレガントなものです。これをコード化する良い方法はありますか?

で何を基本的に行う必要がある。

は、ユーザ入力が言うとき: 4x3+3それはのようなものを返す必要があります:

coeffs = [4,0,0,3]  

これは私がホーナー法を使用して多項式を解くことができるようです。 REPL CODE

コードは次のようにテスト関数を実行します:

x = solve(function) 
x.parse() 

ここで実行可能なコードです。

#!/usr/bin/python3 


    ###################################################################### 
    #code information 
    # 
    # 
    # When the user provides the input of the form 
    # 4x3+2x+1 
    # The parse method is expected to return 
    # A coefficient list of the provided polynomial 
    # in ready for use for the horner's method of solving 
    ####################################################################### 




    function = "4x3+2x+1" #this is the sample input the user is expected to give 

    # 

    class solve: 

     def __init__(self, string): 
      self.function = string 
      self.letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 
          'h', 'i', 'j', 'k', 'l', 'm', 'n', 
          'o', 'p', 'q', 'r', 's', 't', 'u', 
          'v', 'w', 'x', 'y', 'z'] 


     ####################################################################### 
     ####################################################################### 
     ####################################################################### 
     ####################################################################### 

     def parse(self): 

      signs = ['+', '-', '*'] 
      for sign in signs: 
       self.function = self.function.replace(sign, ' ')#this is where all the 
                   #signs are converted 
                   #to spaces 





      self.function = self.function.split()  #this is where all the 
                 #list is split into terms 


      self.function.sort(reverse = True)  #the polynomial is sorted always 
                #in the decreasing order 
                #from higher to lower order of x 





      coeffs = []   #list that holds all the coefficients 

      powers = []   #list that holds all the powers 


      while self.function: 
       term = self.function.pop(0)#for each term in the polynomial 

       for letter in self.letters: 
        #check for the alphabets in the letters(The list above) 



        if letter in term: 
         x, y = term.split(letter) 
         coeffs.append(int(x))#append the coefficient to the list 
         if y != '': 
          powers.append(int(y))#append the power to the list 
         else: 
          powers.append(1) #append 1 for x^1 term 

        else: 
         try: 
          temp = int(term) #exception occurs here 
          coeffs.append(temp)#append constant term after exhaution 
               #of all the polynomial terms 
               #if no constants exits 
               #this is not reached 
               #and neither the line 
               #directly below 
          powers.append(0)#only for a constant,we have power 0 

          break #break nonsense to append only once 
         except: 
          pass #exception passed silently 


      return self.check_complete(coeffs, powers) 








      print("The coefficients are: ", coeffs) 
      print("The powers are: ", powers) 


      ####################################################################### 
      ####################################################################### 
      ####################################################################### 
      ####################################################################### 



     def check_complete(self, coeffs, powers): 
      """This function checks if the polynomial is a 
      complete polynomial that is if it has all the powers of x 
      it does this by comparing the two lists hand in hand, 
      that is checks the corresponding terms""" 

      try: 
       #while the function arrives here 
       #power and range are assumed to be of same length 

       factor = 0 #factor for keeping track of index below 

       for index in range(len(powers)): 



        ######################################## 
        ######################################## 
        Index = index + factor #just cleaning up 


        ######################################## 
        ######################################## 



        difference = powers[Index] - powers[Index+1] 

        while difference > 1: 

         factor += 1 #factor incremented to keep track 
            #of where to add 
         difference -= 1 

         coeffs.insert(Index+1, 0)#in the coefficient list 
              #insert zeros where the 
              #polynomial is missing a term 


      except: 

       return coeffs #pass the exception 
+0

入力制限がありますか?係数を10以上にすることはできますか? – konsolas

+0

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。特に、主な運転プログラムと、得られるアウトプットの例が必要です。 – Prune

+0

@konsolasはい、係数は任意の数値より大きくなる可能性があります – mathmaniage

答えて

1

はい、あなたはこれをあまりにも複雑にしました。また、すべての演算子を追加であるかのように扱うので、構文解析でエラーが発生したと思います。それらをスペースに変更してから、その違いを無視します。私はこれをテストしたいが、あなたはMCVEを提供することに失敗した。

いくつかの簡単な手順をお勧めします。多項式1 + 4x3-2xを考えてみましょう。

  1. あなたのテキストから、単一の小文字の変数を1つだけ許可することができます。アルファベット(すでにシステムパッケージに入っています)を定義する手間を経ないでください。単に文字列内の1文字を見つけ、それをセパレータとして格納します。sep
  2. 任意のプラス記号またはマイナス記号で区切って文字列をスキャンします。 の標識を保持してください。これによりリスト["1", "+4x3", "-2x"]が得られます。
  3. リストをスキャンします。 sep変数のない文字列の場合は、 "x0"を付加します。 sepより先に番号がない場合は、先頭に「1」を付加します。 sepの後に番号がない場合は、「1」を追加します。リストの各要素をスキャンしてください。で分割します。を分割して、リストの各要素をスキャンしてください。要素を整数の組に変換する[(1, 0), (4, 3), (-2, 1)]
  4. 最後に、タプルのリストを作成してみましょう用語を最大パワーで取得し、0のリストの最大インデックスを作成します。対応する電力の位置への係数である。

コード:

size = max[z[1] for z in terms] + 1 
coeff = [0]*size 
for term in terms: 
    coeff[term[1]] = term[0] 
+0

私はseperatorの値としてxを知らなければ、これを分割することができないという事実を忘れました。ありがとう! – mathmaniage