C#算法,大侠请进

yangchun1213 2012-04-05 11:49:34
1. 求两个任意大小的整数的和,差,积,商,这两个整数也许会有1000位,所以很大,int类型根本存不到,应该怎样实现这样的功能?

2. 求巨大整数的阶乘,如10000!是多少,应为10000!会很大,所以也不能用int类存储

望大侠帮忙
...全文
335 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangchun1213 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
同问! 回复内容太短了!
[/Quote]

是的,回复的内容太短了……
ad_min_ 2012-04-15
  • 打赏
  • 举报
回复
同问! 回复内容太短了!
yangchun1213 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
没看我在2l、3l给的链接?库函数的实现,自己的实现都给你了。
[/Quote]

哪里??
threenewbee 2012-04-14
  • 打赏
  • 举报
回复
没看我在2l、3l给的链接?库函数的实现,自己的实现都给你了。
yangchun1213 2012-04-14
  • 打赏
  • 举报
回复
nnd,真的沉了……
jeryzong 2012-04-10
  • 打赏
  • 举报
回复
yangchun1213 2012-04-10
  • 打赏
  • 举报
回复
没有人直接上代码么?看来要沉了……
yangchun1213 2012-04-07
  • 打赏
  • 举报
回复
网上有一些关于大数运算的例子,但没看到有用C#语言写的
在路上20130607 2012-04-06
  • 打赏
  • 举报
回复
是不是版本不够?
在路上20130607 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
biginteger 完破

不用这个
[/Quote]
有什么不好吗?
yangchun1213 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
biginteger 完破
[/Quote]
不用这个
g4_magicvr 2012-04-06
  • 打赏
  • 举报
回复
google一下大数运算就可以了
这个玩意基本上已经是大路货……
yangchun1213 2012-04-06
  • 打赏
  • 举报
回复
楼上两位,能否给个例子,我是想了一天,真没弄出来,内伤了,给点提示
zh6335901 2012-04-06
  • 打赏
  • 举报
回复
不用BigInteger的话,可以考虑使用数组存储各个位的数值
threenewbee 2012-04-06
  • 打赏
  • 举报
回复
在早期版本的.NET中没有BigInteger类,或者你想了解大数计算的原理,你可以参考这个:

http://www.codeproject.com/Articles/2728/C-BigInteger-Class
threenewbee 2012-04-06
  • 打赏
  • 举报
回复
使用 BigInteger 类。
参考:http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
xboxeer 2012-04-06
  • 打赏
  • 举报
回复
刚刚发现有个bug 最高位没法进位 把
var currentResult = theBiggerInter[i-1] + tempSmaller[i-1];
if (currentResult >= 10)
{
++theBiggerInter[i - 1];
resultIntArray[i] = currentResult - 10;
}
else
{
resultIntArray[i] = currentResult;
}//这一段其实就是小学数学,相加大于10就向上一位+1
改成
var currentResult = theBiggerInter[i - 1] + tempSmaller[i - 1] + resultIntArray[i] ;
if (currentResult >= 10)
{
++resultIntArray[i-1];
resultIntArray[i] = currentResult - 10;
}
else
{
resultIntArray[i] = currentResult;
}
[Quote=引用 17 楼 的回复:]

好吧看来你是想让我贴代码了 只写了个相加操作 给你点儿思路
public class BigInter
{
private string _strInt;
private int[] _intArr = null;
private int _length;
public BigInter(string str……
[/Quote]
xboxeer 2012-04-06
  • 打赏
  • 举报
回复
好吧看来你是想让我贴代码了 只写了个相加操作 给你点儿思路
public class BigInter
{
private string _strInt;
private int[] _intArr = null;
private int _length;
public BigInter(string strInt)
{
this._strInt = strInt;
var tempCharArray = this._strInt.ToCharArray();
this._length = tempCharArray.Count();
this._intArr = new int[tempCharArray.Length];
for (int i = 0; i < tempCharArray.Length; i++)//将string里面的数字放到int数组里面
{
var currentStrNum = tempCharArray[i].ToString();
int intNum = 0;
if (int.TryParse(currentStrNum, out intNum))
{
_intArr[i] = intNum;
}
else
{
throw new ArgumentException(string.Format("输入数字在第{0}位不合法", i + 1));
}
}
}

public static string Add(BigInter left, BigInter right)
{
var minLength = Math.Min(left._length, right._length);
var maxLength = Math.Max(left._length, right._length);
var theBiggerInter = left._length > right._length ? left._intArr : right._intArr;
var theSmallerInter = theBiggerInter==left._intArr ? right._intArr : left._intArr;
var tempSmaller = new int[maxLength];
for (int i = 0; i < maxLength; i++)
{
tempSmaller[i] = 0;
}
for (int i =0; i <minLength; i++)
{
tempSmaller[maxLength-i-1] = theSmallerInter[minLength-i-1];
}//上面两个循环将比较小的那个数的前面几位用0填充
var resultIntArray = new int[maxLength + 1];//结果数组需要大一位以保留进位
for (int i = maxLength; i > 0; i--)//反着遍历 符合直觉上的相加
{
var currentResult = theBiggerInter[i-1] + tempSmaller[i-1];
if (currentResult >= 10)
{
++theBiggerInter[i - 1];
resultIntArray[i] = currentResult - 10;
}
else
{
resultIntArray[i] = currentResult;
}//这一段其实就是小学数学,相加大于10就向上一位+1
}
StringBuilder result = new StringBuilder();//输出为string不解释
foreach (var temp in resultIntArray)
{
result.Append(temp.ToString());
}
return result.ToString();
}
}
调用
class Program
{
static void Main(string[] args)
{
var left = new BigInter("12345678901234567890123");//这个应该超出int的范围了吧
var right = new BigInter("12345678901234567890123");
Console.Write(BigInter.Add(left, right));
Console.ReadLine();
}
}
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:
int型数组 每一个元素都代表一位 然后加减乘除就用小学数学加减乘除的方法 无非就是个进位问题~

说的是废话
[/Quote]
yangchun1213 2012-04-06
  • 打赏
  • 举报
回复
到底有人用C#代码去做过没有,来点实际点的吧,我自己想破脑子了,还是没想出来,郁闷极了
yangchun1213 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
int型数组 每一个元素都代表一位 然后加减乘除就用小学数学加减乘除的方法 无非就是个进位问题~
[/Quote]
说的是废话
加载更多回复(6)

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧