• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#4.0提供BigInteger类支持大数运算

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

http://tech.it168.com/a2011/1020/1261/000001261222.shtml

2011年10月20日10:23 来源:博客园 作者:LoveJenny 编辑:皮丽华 评论:0

    【IT168 资讯】前段时间,有个同事说

“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000001”

是个质数。

直觉告诉我,光是在中间加几个0,在后面加个1,估计不是质数。

有很多面试题,都会要面试者去做一些关于大数的运算,例如在这里就有判断上面这个数是不是质数的情况。

很明显,Integer ,Long都是不能来处理如此巨大的数的。

在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 类。使用这个类可以很方便的解决这个问题。

判断n是质数的方法:

1:如果是偶数,肯定不是质数

2:如果能够被小于或等于Sqrt(n) 的数除尽,则不是质数。

代码如下:

privatestaticbool IsPrime()
{
    
string largeNumber =@"30000000000000000000000...000000001”;
    BigInteger bigInteger = BigInteger.Parse(largeNumber);
    if (bigInteger.IsEven)
    {
        return false;
    }
    for (BigInteger bi = 3; BigInteger.Pow(bi, 2) <= bigInteger; bi += 2)
    {
        if (bigInteger % bi == 0)
        {
            return false;
        }
    }
    return true;
}


本来for 循环中的代码应该是

for (BigInteger bi =3; bi <= BigInteger.Sqrt(bigInteger); bi +=2)
{
    
if (bigInteger % bi ==0)
    {
        
returnfalse;
    }
}  

可惜的是BigInteger 不支持Sqrt方法,所以换用

for (BigInteger bi =3; BigInteger.Pow(bi, 2) <= bigInteger; bi +=2)


 结果如下图:

可以知道”30000000000000000000000000…………………………..1”不是质数,可以被13除尽。

 

2:C语言中有道经典的题目是求100!后面有几个0.


如果你不知道BigInteger的话,应该怎么做?

 100! 可以理解为 


 因为偶数比5要多,所以i值比j值多很多,所以求100!有多少个0,可以认为是求j的值 

当然也可以用公式

 Sum = [100/5]+[100/(5^2)]+[100/(5^3)]=20+4+0=24;

 如果你既没有思路,也没有公式,脑子里面只有一个念头:1*2*3*4*5*..*100 的for循环,然后统计0的数量的话,在4.0 中也可以实现,虽然好像速度慢了点,不过也还是可以得到答案的:

 代码如下:

 

统计的代码如下:

运行结果如下:

int count =0;
for (int i = strSum.Length -1; i >=0; i--)
{
    
if (strSum[i] =='0')
    {
        count
++;
    }
    
else
    {
        
break;
    }
}

 

   还有很多使用大数的运算的地方,都等待着你的发挥!

关于BigInteger的详细介绍,可以参考CodeProject上的 BigInteger Library

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言文件操作fseek,fread,rewind发布时间:2022-07-13
下一篇:
C#列表所有IIS站点以及相关站点属性发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap