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

时间:2022-02-02 06:40:05 

前段时间,有个同事说

“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)

 结果如下图:

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

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

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

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

 100! 可以理解为C# 4.0 大数的运算--BigInteger的应用详解

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

 代码如下:

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

统计的代码如下:

运行结果如下:


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



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

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

标签:大数运算,biginteger
0
投稿

猜你喜欢

  • Flutter应用集成极光推送的实现示例

    2023-06-24 03:51:04
  • java中的Arrays这个工具类你真的会用吗(一文秒懂)

    2021-11-28 06:25:11
  • Java RandomAccessFile 指定位置实现文件读取与写入

    2023-06-05 17:06:25
  • JVM内存管理之JAVA语言的内存管理详解

    2021-11-01 12:00:10
  • Java8新特性之接口中的默认方法和静态方法

    2021-08-21 07:25:43
  • Java @Accessors注解图文详解

    2023-10-10 06:06:51
  • Maven工程打包jar的多种方式

    2022-12-15 06:54:46
  • 解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

    2021-07-07 12:27:20
  • Java 求解如何把二叉搜索树转换为累加树

    2021-11-19 14:09:54
  • JavaWeb中导出excel文件的简单方法

    2023-11-13 02:41:43
  • SpringBoot整合Security安全框架实现控制权限

    2022-10-03 14:37:15
  • Spring MVC URL地址映射的示例代码

    2022-12-09 19:53:33
  • 解决SpringMVC、tomcat、Intellij idea、ajax中文乱码问题

    2023-10-20 10:16:23
  • JAVA 继承基本类、抽象类、接口介绍

    2022-11-11 00:09:40
  • java进阶解析Springboot上传excel存入数据库步骤

    2022-01-07 15:18:51
  • SpringBoot中的Thymeleaf用法

    2023-10-30 17:30:39
  • Java实现获取客户端真实IP方法小结

    2021-10-15 03:53:16
  • MyBatis使用动态SQL标签的小陷阱

    2023-09-11 04:42:57
  • Java中ReentrantLock4种常见的坑

    2021-09-26 10:51:46
  • spring boot 注入 property的三种方式(推荐)

    2023-01-23 05:10:27
  • asp之家 软件编程 m.aspxhome.com