编程题

作者: 佐鼬鸣 | 来源:发表于2022-08-10 15:56 被阅读0次
namespace ApplicationCore.TestBase;
using System;

public class Class1
{
    public static void Main(string[] args)
    {
        // 一个 node 代表一个数字,数字的大小理论上可以无限大
        //[1,1,2,5] 321 node1
        //[  3,4,5] 543 node2
        //[1,4,7,0] 864 result

        var node1 = new Node()
        {
            Value = '1',
            Next = new Node
            {
                Value = '1',
                Next = new Node()
                {
                    Value = '2',
                    Next = new Node()
                    {
                        Value = '5'
                    }
                }
            }
        };

        var node2 = new Node()
        {
            Value = '3',
            Next = new Node()
            {
                Value = '4',
                Next = new Node()
                {
                    Value = '5'
                }
            }
        };

        Console.WriteLine(node1);
        Console.WriteLine(node2);

        var result = CombineNode(node1, node2);

        Console.WriteLine(result);
        Console.ReadKey();
    }

    // 完成这个函数,使 node1 + node2 得到 两个数字的和的 Node
    public static Node CombineNode(Node node1, Node node2)
    {
        Node maxNode;
        Node minNode;
        var x = node1.Length - node2.Length;
        if (x > 0)
        {
            maxNode = node1;
            minNode = node2;
        }
        else
        {
            maxNode = node2;
            minNode = node1;
        }

        //将node1 和 node2 按位相加
        Node Add(Node node1, Node node2, ref bool r)
        {
            var node = new Node();
            if (node1.Next == null || node2.Next == null)
            {
                node.Value = AddChar(node1.Value, node2.Value, ref r);
                return node;
            }

            node.Next = Add(node1.Next, node2.Next, ref r);
            node.Value = AddChar(node1.Value, node2.Value, ref r);

            return node;
        }

        var temp = maxNode;
        var result = new Node(maxNode.Value);
        for (long i = 0; i < Math.Abs(x); i++)
        {
            temp = temp.Next;
            var parent = result.Next;
            while (result.Next != null)
            {
                parent = parent.Next;
            }
            if (parent != null)
                parent.Next = new Node(temp.Next.Value);
            else
                result.Next = new Node(temp.Next.Value);
        }

        result.Next = null;

        bool r = false;

        result.Next = Add(minNode, temp, ref r);
        if (result != null)
            return result;
        return result.Next;
    }

    static char AddChar(char c1, char c2, ref bool r)
    {
        var c = int.Parse(c1.ToString()) + int.Parse(c2.ToString());
        if (r)
        {
            c++;
            r = false;
        }

        if (c > 9)
        {
            r = true;
            return c.ToString()[1];
        }
        else return c.ToString()[0];
    }
}


public class Node
{
    public char Value { get; set; } = '0';

    public Node Next { get; set; }

    public Node() { }

    public Node(char value)
    {
        Value = value;
    }

    public override string ToString()
    {
        if (Next != null)
            return Value.ToString() + Next.ToString();
        return Value.ToString();
    }

    public long Length
    {
        get
        {
            if (Next == null)
                return 0;
            return Next.Length + 1;
        }
    }
}

相关文章

网友评论

      本文标题:编程题

      本文链接:https://www.haomeiwen.com/subject/xfctgrtx.html