2013-12-19 49 views
3

所以我有一個創建一個用戶輸入號碼的主要因素二叉樹並將其顯示在TreeView控件的程序:創建一個數的因式分解的字符串(含指數)

Example One

Example Two

現在我想創建像在消息框所示的那些字符串,除了與指數( 「256 = 2^8」,「1234567890 = 2 X 3^2 X 5 X 3607 X 3803 「)

我目前的代碼如下所示:

private void LabelDisplayCondensed(FactorTreeNode currentNode) 
{ 
    string result = Convert.ToString(root.Key) + " = " 
        + Convert.ToString(currentNode.Left.Key); 
    FactorTreeNode prevNode = currentNode; 
    int exponent = 1; 
    while (currentNode.Right != null) 
    { 
     prevNode = currentNode; 
     currentNode = currentNode.Right; 
     if (currentNode.Left.Key == prevNode.Left.Key) 
     { 
      exponent += 1; 
     } 
     else 
     { 
      exponent = 1; 
     } 
     if ((exponent != 1) && (currentNode.Left.Key != prevNode.Left.Key)) 
     { 
      result += "^" + exponent + " X " + currentNode.Left.Key; 
     } 
    } 
    MessageBox.Show(result); 
} 

這是我最新的絕望嘗試。該函數使用樹的根來調用。我意識到這個代碼是完全有缺陷的。目前的牆我打的是currentNode達到最右邊的子樹,評估在

if (currentNode.Left.Key == prevNode.Left.Key) 

其.Left.Key關鍵和崩潰,因爲。左爲空。

我其實早得更近。我認爲500點評價爲「500 = 2^2 X 5^2^2」我認爲(而不是理想的500 = 2^2 X 5^3)

這裏是代碼爲我的FactorTreeNode:

class FactorTreeNode 
    { 
     // constants 

     // variables 
     private long data;   // this is our only data, so also key 
     private FactorTreeNode leftPointer; 
     private FactorTreeNode rightPointer; 
             // these pointers point to the 
             // left and right children respectively 
     private FactorTreeNode parentPainter; 
             // pointer to the parent of the node 

     // constructors 
     public FactorTreeNode(long newValue) 
     { 
      Key = newValue; 
      Left = null; 
      Right = null; 
      Parent = null; 
     } 

     // Properties 
     public long Key 
     { 
      get 
      { 
       return data; 
      } 
      set 
      { 
       data = value; 
      } 
     } 

     public FactorTreeNode Left 
     { 
      get 
      { 
       return leftPointer; 
      } 
      set 
      { 
       leftPointer = value; 
      } 
     } 

     public FactorTreeNode Right 
     { 
      get 
      { 
       return rightPointer; 
      } 
      set 
      { 
       rightPointer = value; 
      } 
     } 

     public FactorTreeNode Parent 
     { 
      get 
      { 
       return parentPainter; 
      } 
      set 
      { 
       parentPainter = value; 
      } 
     } 
    } 

我一直在咀嚼這一整天。我感謝任何幫助。

+0

你沒有說你嘗試了什麼,也沒有說明狀態是什麼,也沒有說你的代碼爲什麼被破壞。你期望什麼樣的幫助? – Noctis

+1

我認爲這個問題非常清楚,並顯示瞭解決問題的嘗試。 – Ergwun

+0

對不起,Noctis。我有點油炸。我試圖澄清一些。 – Gerald

回答

1

假設你FactorTreeNodeclass是這樣的:

class FactorTreeNode 
{ 
    public FactorTreeNode(long key) { this.Key = key; } 
    public FactorTreeNode Left { get; set; } 
    public FactorTreeNode Right { get; set; } 
    public long Key { get; private set; } 
} 

那麼這將工作:

private void LabelDisplayCondensed(FactorTreeNode root) 
{ 
    string result = Convert.ToString(root.Key) + " ="; 

    long prevFactor = 0; 
    int exponent = 0; 
    bool firstFactor = true; 
    FactorTreeNode currentNode = root; 
    while (currentNode != null) 
    { 
     long nextFactor = currentNode.Left == null ? 
      currentNode.Key : 
      currentNode.Left.Key; 
     if (nextFactor != prevFactor && prevFactor != 0) 
     { 
      result += WriteFactor(prevFactor, exponent, ref firstFactor); 
      exponent = 1; 
     } 
     else 
     { 
      exponent++; 
     } 

     prevFactor = nextFactor; 
     currentNode = currentNode.Right; 
    } 

    result += WriteFactor(prevFactor, exponent, ref firstFactor); 
    MessageBox.Show(result); 
} 

private string WriteFactor(long factor, int exponent, ref bool firstFactor) 
{ 
    string result = firstFactor ? " " : " X "; 
    firstFactor = false; 
    if (exponent == 1) 
    { 
     result += factor.ToString(); 
    } 
    else 
    { 
     result += factor.ToString() + "^" + exponent.ToString(); 
    } 

    return result; 
} 

顯然,這不包括檢查該樹是有效的。

您可能還想使用StringBuilder實際構建字符串,而不是執行所有這些附加操作。

+0

我在原始文章中添加了FactorTreeNode的代碼。 [你的代碼得到這些錯誤](http://i.imgur.com/BRDdmJg.png)。我不熟悉'int nextFactor = currentNode.Left == null?'的語法。 – Gerald

+0

我將參數重命名爲'LabelDisplayCondensed'作爲'root',你沒有這樣做。 此外,由於你的樹使用長整型,所以你應該把'nextFactor'等改爲'long'類型。 – Ergwun

+0

編輯爲使用'long'而不是'int'。 – Ergwun

1

,你會嘗試這種方法

private void LabelDisplayCondensed(FactorTreeNode currentNode) 
    { 
     string result = Convert.ToString(root.Key) + " = " + Convert.ToString(currentNode.Left.Key); 
     FactorTreeNode prevNode = currentNode; 
     int exponent = 1; 
     while (currentNode.Right != null && currentNode.Left!= null) 
     { 
      prevNode = currentNode; 
      currentNode = currentNode.Right; 
      if ( currentNode.Left.Key == prevNode.Left.Key && currentNode.Right != null) //updated ***************** 
      { 
       exponent++; 
       continue; 
      } 
      else if (exponent != 1) 
      { 
       result += "^" + exponent ; 
       exponent = 1; 

      } 

       result += " X " + currentNode.Left.Key; 
     } 
     MessageBox.Show(result); 
    } 
+0

[評估100讓你在這裏](http://i.imgur.com/m5K6m2G.png) – Gerald

+0

你是什麼意思是由左右,如何獲得當前樹項目價值 –

+0

@Gerald我更新了我的代碼再試一次! –

1

從它看起來,你是跑下來的樹,並檢查是否當前值等於前一個,爲了弄清楚有多少次因素出現。

當你有3x3x37時會發生什麼?你有3開始,下一次迭代你有3個,所以你增加你37,因此需要設置指數爲1的指數,下一次迭代...

你需要有去像

邏輯
  • 看當前節點,如果同一個先前節點
    • 增長指數,重複,直到你找到一個不同的節點
  • 打印與指數的節點,如果不是1

我假設你的節點是有序的,否則你將不得不在其中加入更多的努力,但無論哪種方式,你都需要在字符串中添加x的值,即使它沒有指數> 1,這看起來你沒有做ATM。

相關問題