C#:C高精度算法移植

** 由于参加系里比赛的需要,把C语言的算法移植到C#上了,语法基本一样,没用多久
高精度算法类:HPA(High Precision Algorithm) **

这里写图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication21
{
    internal class HPA
    {
        public string OP1 { get; set; }
        public string OP2 { get; set; }
        public HPA(string OP1, string OP2)
        {
            this.OP1 = OP1;
            this.OP2 = OP2;
        }
        public List<int> Add()
        {
            int MAX, i;
            List<int> a = new List<int>();//动态数组定义
            List<int> b = new List<int>();
            a.Add(OP1.Length);//第0位储存位数
            b.Add(OP2.Length);
            if (a[0] >= b[0])
            {
                MAX = a[0];
            }
            else
            {
                MAX = b[0];
            }
            for (i = 0; i < MAX+1; i++)//提前分配空间
            {
                a.Add(0);
                b.Add(0);
            }
            for (i = 1; i <= a[0]; i++)//倒序存储
            {
                a[i] = OP1[a[0] - i] - '0';
            }
            for (i = 1; i <= b[0]; i++)
            {
                b[i] = OP2[b[0] - i] - '0';
            }
            for (i = 1; i <= MAX; i++)//竖式加法
            {
                a[i + 1] += (a[i] + b[i]) / 10;//进位
                a[i] = (a[i] + b[i]) % 10;
            }
            if (a[i] > 0 && MAX == a[0])//最高位进位处理
                a[0] += 1;
            if (a[i] > 0 && MAX == b[0])
                a[0] = b[0] + 1;
            return a;
        }
        public List<int> Sub()
        {
            int MAX, i, f = 0;
            List<int> a = new List<int>();//动态数组定义
            List<int> b = new List<int>();
            a.Add(OP1.Length);//第0位储存位数
            b.Add(OP2.Length);
            if (a[0] >= b[0])
            {
                MAX = a[0];
            }
            else
            {
                MAX = b[0];
            }
            for (i = 0; i < MAX + 1; i++)//提前分配空间
            {
                a.Add(0);
                b.Add(0);
            }
            for (i = 1; i <= a[0]; i++)//倒序存储
            {
                a[i] = OP1[a[0] - i] - '0';
            }
            for (i = 1; i <= b[0]; i++)
            {
                b[i] = OP2[b[0] - i] - '0';
            }
            /*          操作数比较开始          */

            if (a[0] > b[0])//依据位数比较大小
                f = 1;
            else
            {
                if (a[0] < b[0])//依据位数比较大小
                    f = 0;
                else
                {
                    for (i = a[0]; i > 0; i--)//从高位开始比较大小
                    {
                        if (a[i] > b[i])
                            f = 1;
                        if (a[i] < b[i])
                            f = -1;
                    }
                }
            }
            /*          操作数比较结束          */

            /*          计算开始          */

            if (f == 1)//竖式减法
            {
                for (i = 1; i <= MAX; i++)
                {
                    if (a[i] < b[i])//借位
                    {
                        a[i + 1] -= 1;
                        a[i] = 10 - b[i] + a[i];
                    }
                    else
                    {
                        a[i] = a[i] - b[i];
                    }
                }
                return a;
            }
            else
            {
                for (i = 1; i <= MAX; i++)
                {
                    if (b[i] < a[i])//借位
                    {
                        b[i + 1] -= 1;
                        b[i] = 10 - a[i] + b[i];
                    }
                    else
                    {
                        b[i] = b[i] - a[i];
                    }
                    b[0] = -b[0];//传递负数结果
                }
                return b;
            }

            /*          计算结束          */
        }
        public List<int> Mul()
        {
            int MAX, i, j;
            List<int> a = new List<int>();//动态数组定义
            List<int> b = new List<int>();
            List<int> c = new List<int>();
            a.Add(OP1.Length);//第0位储存位数
            b.Add(OP2.Length);
            if (a[0] >= b[0])
            {
                MAX = a[0];
            }
            else
            {
                MAX = b[0];
            }
            for (i = 0; i < MAX + 1; i++)//提前分配空间
            {
                a.Add(0);
                b.Add(0);
            }
            for (i = 0; i <= a[0] + b[0]; i++)
            {
                c.Add(0);
            }
            for (i = 1; i <= a[0]; i++)//倒序存储
            {
                if (OP1[a[0] - i] == '-')
                    break;
                a[i] = OP1[a[0] - i] - '0';
            }
            for (i = 1; i <= b[0]; i++)
            {
                if (OP2[b[0] - i] == '-')
                    break;
                b[i] = OP2[b[0] - i] - '0';
            }
            for (i = 1; i <= a[0]; i++)//无进位竖式乘法
            {
                for (j = 1; j <= b[0]; j++) 
                    c[i + j-1] += a[i] * b[j];
            }
            for (i = 1; i < a[0] + b[0]; i++)//进位处理
            {
                c[i + 1] += c[i] / 10;
                c[i] %= 10;
            }
            while (c[i]==0 && i >= 0)//输出位数计算
                i--;
            c[0] = i;
            if (OP1[0] == '-' )
            {
                if (OP2[0] == '-') ;
                else
                    c[0] = -c[0];
            }
            else
            {
                if (OP2[0] == '-')
                    c[0] = -c[0];
                else ;
            }
            return c;

        }
    }
}

界面部分

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication21
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int i;
            if (cz1.Text == "" | cz2.Text == "")
            {
                MessageBox.Show("您还有操作数没有输入");
            }
            else
            {
                List<int> res = new List<int>();
                HPA H = new HPA(cz1.Text, cz2.Text);
                res = H.Add();
                rult.Text = null;
                for (i = res[0]; i > 0; i--)
                {
                    rult.Text = rult.Text + res[i].ToString();
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            int i;
            if (cz1.Text == "" | cz2.Text == "")
            {
                MessageBox.Show("您还有操作数没有输入");
            }
            else
            {
                List<int> res = new List<int>();
                HPA H = new HPA(cz1.Text, cz2.Text);
                res = H.Sub();
                rult.Text = null;
                if (res[0] < 0)//如果结果为负数
                {
                    rult.Text = "-";
                    res[0] = -res[0];
                }
                for (i = res[0]; i > 0; i--)
                {
                    rult.Text = rult.Text + res[i].ToString();
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int i;
            if (cz1.Text == "" | cz2.Text == "")
            {
                MessageBox.Show("您还有操作数没有输入");
            }
            else
            {
                List<int> res = new List<int>();
                HPA H = new HPA(cz1.Text, cz2.Text);
                res = H.Mul();
                rult.Text = null;
                if (res[0] < 0)//如果结果为负数
                {
                    rult.Text = "-";
                    res[0] = -res[0];
                }
                for (i = res[0]; i > 0; i--)
                {
                    rult.Text = rult.Text + res[i].ToString();
                }
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            MessageBox.Show("高精度加法:仅支持无符号十进制整数运算\n高精度减法:仅支持无符号十进制整数运算\n高精度乘法:仅支持带符号十进制整数运算\n数学表达式求解:不支持高精度运算");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            MessageBox.Show("这个还没有做......");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/kongming07/article/details/78767852