博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道面试题(C#实现了超大整数的加减乘法运算)
阅读量:6659 次
发布时间:2019-06-25

本文共 2667 字,大约阅读时间需要 8 分钟。

static void Main(string[] args)

{
String a = "5661819829134871879051910331902406583704611050840296586361716685667708181008762236714628309134558913";
String b = "3411153732148254698742623133189372941607630447158281924926002101211802711589274474153788470764953449";
String rst = null;

Console.WriteLine("请输入您要进行的运算:1--加法;2--减法;3--乘法!");

int flag = int.Parse(Console.ReadLine());
if (flag == 1 || flag == 2)
rst = AccountA(a, b, flag);
else if (flag == 3)
rst = AccountB(a, b, flag);
Console.WriteLine("整数A为:");
Console.WriteLine(a);
Console.WriteLine("整数B为:");
Console.WriteLine(b);
Console.WriteLine("运算结果为:");
Console.Write(rst);
Console.ReadKey();
}
static String AccountB(String strA, String strB, int flag)
{
String rst = null;
int[,] a = new int[strB.Length, strA.Length + strB.Length];
int num1, num2, carry = 0, sum = 0, temp;
int[] s = new int[a.GetLength(1)];

for (int i = 0; i < a.GetLength(0); i++)

for (int j = 0; j < a.GetLength(1); j++)
a[i, j] = 0;
for (int i = strB.Length - 1; i >= 0; i--)
{
int j = strA.Length - 1;
for (; j >= 0; j--)
{
num1 = int.Parse(strA[j].ToString());
num2 = int.Parse(strB[i].ToString());
temp = num1 * num2 + carry;
a[strB.Length - i - 1, i + j + 1] = temp % 10;
carry = temp / 10;
}
a[strB.Length - i - 1, i + j + 1] = carry;
carry = 0;
}

for (int i = a.GetLength(1) - 1; i > 0; i--)

{
temp = 0;
for (int j = 0; j < a.GetLength(0); j++)
temp += a[j, i];
temp += carry;
s[i] = temp % 10;
carry = temp / 10;
}
s[0] = carry + a[a.GetLength(0) - 1, 0];
for (int i = 0; i < s.Length; i++)
rst += s[i].ToString();

//Code End

return rst;

}
static String AccountA(String strA, String strB, int flag)
{
String rst = null;
String strC = null, strD = null;
char[] a = new char[strA.Length + 1];
int b, c, carry = 0, borrow = 0, temp = 0;

//Code Begin

if (flag == 1)
{
for (int i = strA.Length - 1; i >= 0; i--)
{
b = int.Parse(strA[i].ToString());
c = int.Parse(strB[i].ToString());
temp = b + c + carry;
a[i + 1] = (char)(temp % 10 + 48);
carry = temp / 10;
}
a[0] = (char)(carry + 48);
if (a[0] != '0')
rst += a[0];
else
rst = null;
for (int i = 1; i < a.Length; i++)
rst += a[i];
}
else
{
if (strA.CompareTo(strB) < 0)
{
strC = strB;
strD = strA;
rst += '-';
}
else
{
strC = strA;
strD = strB;
}
for (int i = strC.Length - 1; i >= 0; i--)
{
b = int.Parse(strC[i].ToString());
c = int.Parse(strD[i].ToString());
temp = b - c - borrow;
a[i + 1] = (char)((temp + 10) % 10 + 48);
if (temp < 0)
borrow = 1;
else
borrow = 0;
}
for (int i = 1; i < a.Length; )
if (a[i] == '0' && (rst == '-'.ToString() || rst == null))
i++;
else
{
rst += a[i];
i++;
}
}

return rst;

}
}

转载于:https://www.cnblogs.com/xinshijie/archive/2012/05/24/2517164.html

你可能感兴趣的文章
KVM虚拟化的部署及使用
查看>>
Linux软链接和硬链接文件
查看>>
semaphore.h
查看>>
java学习笔记 --- 网络编程(套接字)
查看>>
tkinter 03 Listbox 列表部件
查看>>
Linux磁盘管理命令介绍
查看>>
一锤定音:高通(Qualcomm)370亿美元收购NXP,成为全球第一大汽车芯片供应商...
查看>>
JVM工作原理学习笔记
查看>>
windows 共享访问相关问题
查看>>
DC的sysvol目录管理!
查看>>
apache 防盗链 与 地址重写
查看>>
python3版本mysql的操作
查看>>
登录式shell与非登录式shell
查看>>
指针参数是如何传递内存的
查看>>
Server系列7:看win2012时代如何强制还原记录数据
查看>>
Linux下查看文件和文件夹大小 du df
查看>>
mongodb数据备份与恢复
查看>>
elf文件解析(cpp版)
查看>>
使用VS2010编译MongoDB C++驱动详解
查看>>
负载均衡(Load Balancing)学习笔记(三)
查看>>