ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-创建一个数的质数分解的字符串(带指数)

2019-11-22 10:08:05  阅读:262  来源: 互联网

标签:prime-factoring binary-tree c


因此,我有一个程序可以创建用户输入数字的主要因素的二叉树并将其显示在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到达树中最右边的孩子,评估其.Left.Key的关键

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

并崩溃,因为.Left为空.

实际上我早些时候离我很近.我认为在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;
            }
        }
    }

我整天都在咀嚼.感谢您的帮助.

解决方法:

假设您的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实际构建字符串,而不是执行所有这些附加操作.

标签:prime-factoring,binary-tree,c
来源: https://codeday.me/bug/20191122/2059022.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有