** Due to the needs of participating in the competition in the department, the algorithm of C language was transplanted to C#, the syntax is basically the same, and it didn't take long.
High-precision algorithm class: 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;
}
}
}
interface part
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("这个还没有做......");
}
}
}