C# 4.0 大数的运算--BigInteger的应用详解

 更新时间:2013年05月13日 16:52:21   作者:  
本篇文章是对C# 4.0 大数的运算 BigInteger的应用进行了详细的分析介绍,需要的朋友参考下
前段时间,有个同事说

“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000001”
是个质数。
直觉告诉我,光是在中间加几个0,在后面加个1,估计不是质数。
有很多面试题,都会要面试者去做一些关于大数的运算,例如在这里就有判断上面这个数是不是质数的情况。

很明显,Integer ,Long都是不能来处理如此巨大的数的。
在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 类。使用这个类可以很方便的解决这个问题。
判断n是质数的方法:
1:如果是偶数,肯定不是质数
2:如果能够被小于或等于Sqrt(n) 的数除尽,则不是质数。
代码如下:
复制代码 代码如下:

private static bool 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)
    {
        return false;
    }
}

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

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

 结果如下图:

image

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

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

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

 100! 可以理解为image

 因为偶数比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 中也可以实现,虽然好像速度慢了点,不过也还是可以得到答案的:

 代码如下:

image 

统计的代码如下:

运行结果如下:

复制代码 代码如下:

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


image 

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

相关文章

  • C#基于百度AI实现机器翻译功能

    C#基于百度AI实现机器翻译功能

    众所周知,基于百度ai开发平台我们可以实现了人脸识别、文字识别 、语音识别等功能。本文将介绍它的另一个功能,即实现机器翻译,感兴趣的可以了解一下
    2022-01-01
  • 轻松学习C#的foreach迭代语句

    轻松学习C#的foreach迭代语句

    轻松学习C#的foreach迭代语句,  C#语言提供了一个for语句循环的捷径,而且还促进了集合类的更为一致,就是本文提到的foreach语句,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • C#获取汉字字符串拼音首字母的方法

    C#获取汉字字符串拼音首字母的方法

    这篇文章主要介绍了C#获取汉字字符串拼音首字母的方法,实例分析了C#操作汉字及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 自定义WPF窗体形状的实战记录

    自定义WPF窗体形状的实战记录

    WPF是制作界面的一大利器,下面这篇文章主要给大家介绍了关于自定义WPF窗体形状的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们一起来看看吧
    2018-09-09
  • C#动态生成PictureBox并指定图片的方法

    C#动态生成PictureBox并指定图片的方法

    这篇文章主要介绍了C#动态生成PictureBox并指定图片的方法,实例分析了C#图形控件的动态生成及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#控制图像旋转和翻转的方法

    C#控制图像旋转和翻转的方法

    这篇文章主要介绍了C#控制图像旋转和翻转的方法,涉及C#图像操作中RotateFlip方法的相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • C# TreeView控件使用代码

    C# TreeView控件使用代码

    TreeView控件的实例代码,需要的朋友可以参考下。
    2009-09-09
  • C#查找列表中所有重复出现元素的方法

    C#查找列表中所有重复出现元素的方法

    这篇文章主要介绍了C#查找列表中所有重复出现元素的方法,涉及C#针对列表操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#使用DLLImport调用外部DLL的方法

    C#使用DLLImport调用外部DLL的方法

    这篇文章介绍了C#使用DLLImport调用外部DLL的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C# 大数据导出word的假死报错的处理方法

    C# 大数据导出word的假死报错的处理方法

    C# 大数据导出word的假死报错的处理方法,需要的朋友可以参考一下
    2013-03-03

最新评论