前引

由于x最大是1e9,并且有T组数据,因此用for循环便利x寻找多少个因子,判断是否是质数,最坏的时间复杂度是O(n^3)。

因此我们需要用另一种更加简洁的方法来做本道题。

例:48 = 2^4 * 3^1 我们要做的是将一个数写成质因子的乘方相乘

如何写呢?

主要代码解析

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
	for(int i=2;i <= sqrt(n+1e-6);i ++)    
		{
   	         if(n%i==0)                 
			{
				v.push_back(i);
				f = 0;
			}
			while(n%i==0)
			{
				n=n/i;
			}
		}
  return 0;
}

此代码块用vector->"v"存储n的所有种类的质因子。

其中 sqrt(n+1e-6) 指 n的开方。因为质因子永远不会超过n的开方,可以减少时间复杂度。

接下来是重要板块。

while循环是一口气把这个质因子的x次方除以完,也就相当于除以质因子的x次方。

但是为什么前面是只要i是n的因子就可以被除呢?打个比方,n=48,刚开始你除以了2^4,那么后面的4也是48的因子,不过48已经把所有的2除以玩了,因此48编程3,除以不动2了。

剩下部分

剩下的部分就是简单易懂的输入输出套进去

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
	int T;
	cin>>T;
	for(int i = 1;i <= T;i ++)
	{
		int n;
	   cin>>n;
	   vector<int>v;int f = 1;
	   for(int i=2;i <= sqrt(n+1e-6);i ++)
	   {
            if(n%i==0)
            {
                v.push_back(i);
			     f = 0;
            }
            while(n%i==0)
            {
                n=n/i;
            }
        } 
	   if(n>1)v.push_back(n);
	   if(f==1)
	   {
		  cout<<"isprime"<<endl;
		  cout<<n<<endl;
	   }
	   else
	   {
		  cout<<"noprime"<<endl;
		  for(int i = 0;i < v.size();i ++)
		  {
		      	cout<<v[i]<<" ";
	       	}
	   	   cout<<endl;
    	}
	}
return 0;
}

就问详细不详细吧 awa