我卢本伟没有开挂!

题目描述

众所周知,卢本伟没有开挂,如何验证他没有开挂呢?这里我们发现一个算法通过输出d能够证明他有没有开挂
1:如果 n = 0,结束算法
2:find the smallest prime divisor dd of nn;
3:n减去d并且跳转到第一步
输入
仅包含一个整数n(2<=n<=10^10)
输出
仅输出一个整数,这个算法最后得到的操作的次数
样例输入
5
样例输出
1

分析:

本题看似简单,但是如果将素数打表或者直接判断都会时间超限。通过不断分析样例我们会发现一个偶数,他每次减去的素数都是2, 所减去的次数即是n/2;这是一个偶数的情况,那么一个奇数,我们会发现,他减去他所能整除的最小素数。那么就会变成偶数。所以可以通过这样来判断。然后特殊情况是当n=1 的时候。n=1 那么所减次数也是1次。

#include"stdio.h"
long long b[10001];
long long isprime(long long a)
{

    long long i,j,k,t;
    for(i=2;; i++)
    {
        if(a%i==0)
            for(j=2; j<i; j++)
                if(i%j==0)
                    break;
        if(j==i)
            return j;
    }
}
int main()
{
    long long n,i,d,j;

    while(~scanf("%lld",&n))
    {
        d=0;
        if(n%2==0)
        {
            d=n/2;
        }
        else
        {
            if(n==1)
                d=1;
            else if(n!=1)
            {
                n=n-isprime(n);
                d=1+n/2;
            }

        }
        printf("%lld\n",d);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84578379
今日推荐