LeetCode1175. 质数排列Prime Arrangements

By Jalan

知识工具需求

数学

质数验证

题解

思路

求素数然后求组合数的问题
很简单的题目,但是求素数这里水比较深
代码中的求素数方法是我在多种方案下验证int左右prime最快的方法,在longlong范围内也不会差米勒罗宾很多.

编写用时

10分钟

代码

CPP
class Solution
{
public:
    int numPrimeArrangements( int n )
    {
        int primeCount   = 0;
        int noPrimeCount = n;
        while ( n ) {
            if ( isPrime( n ) ) {
                primeCount++;
            }
            n--;
        }
        noPrimeCount = noPrimeCount - primeCount;
        long long a = 1, b = 1;
        while ( noPrimeCount ) {
            a = ( a * noPrimeCount ) % ( int )( 1e9 + 7 );
            noPrimeCount--;
        }
        while ( primeCount ) {
            b = ( b * primeCount ) % ( int )( 1e9 + 7 );
            primeCount--;
        }
        return ( a * b ) % ( int )( 1e9 + 7 );
    }
    bool isPrime( int num )
    {
        {
            if ( num == 1 ) {
                return 0;
            }
            //两个较小数另外处理
            if ( num == 2 || num == 3 )
                return 1;
            //这部分的处理其实最好在函数外面完成
        }
        //不在6的倍数两侧的一定不是质数
        if ( num % 6 != 1 && num % 6 != 5 )
            return 0;
        int tmp = sqrt( num );
        //在6的倍数两侧的也可能不是质数
        for ( int i = 5; i <= tmp; i += 6 )
            if ( num % i == 0 || num % ( i + 2 ) == 0 )
                return 0;
        //在6两侧的数可能本身是有倍数关系的,需要检测能否被从5开始的6的两侧的数整除
        //排除所有,剩余的是质数
        return 1;
    }
};
运行用时

在这里插入图片描述

结尾

看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀
@.@
也欢迎关注我的CSDN账号呀=]

                                        **开心code每一天**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值