1 条题解

  • 7
    @ 2024-12-11 22:44:15

    ——闲来无事,水题,三次才过,惊觉有坑,遂投此帖。

    看了一下米纳桑的提交记录,发现大部分是90分WA样例1的,代码大概就是这样的:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int p(int n)
    {
    	for(int i=2;i<=sqrt(n);i++)
    	{
    		if(n%i==0)
    		{
    			return 1;
    		}
    	}
    	return 0;
    }
    int main()
    {
    	cin>>n;
    	if(p(n)==1) cout<<"No";
    	else cout<<"Yes";
    	return 0;
     } 
    

    首先为啥这样写?

    先插入一个质数的概念:‌质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数‌。

    知道了这个概念自然就好做了,直接循环判断2-n之间有没有整除n的,有的话n就不是质数。

    但是这里不用循环到n,因为你想想一个数的因数都是两两配对的,只有有小因数就会有一个和它乘积为n的大约数所以我们这里只用从2循环到sqrt(n)

    是不是感觉没问题了?

    BUT

    只有90pts,样例1WA掉了

    是不是有点怀疑人生了🌚

    再想想呢

    欸盲生你发现了华点🤓☝️☝️

    这个1有问题呀,上面的代码你输入1的话它会输出Yes,但是显然1不是质数也不是合数,我们的循环是从2开始的,当然就没有判断1,直接就输出Yes了当然会错

    所以我们直接给它来个大特判

    如果n==1直接输出No

    你猜这样能不能过

    记得要return 0,不然会在后面多输出

    看懂的是这个👍👍

    AC code:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int p(int n)
    {
    	for(int i=2;i<=sqrt(n);i++)
    	{
    		if(n%i==0)
    		{
    			return 1;
    		}
    	}
    	return 0;
    }
    int main()
    {
    	cin>>n;
    	if(n==1){cout<<"No";return 0;} 
    	if(p(n)==1) cout<<"No";
    	else cout<<"Yes";
    	return 0;
     }
    

    我看谁敢直接copy,让你感受到什么是恶梦缠绕🤓☝️

    信息

    ID
    90
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    149
    已通过
    27
    上传者