15级卓工班选拔-质因数两个

题目描述

分解质因数是计算机编程永恒的话题。
请问给你一个大于2的正整数k,问此数是否满足每个不同的质因子的个数恰巧均为两个。
如:2 * 2 和 2 * 2 * 3 * 3  是, 2 * 2 * 2 * 3 * 3不是。

输入

第一行,一个整数N,表示下面将有N行每行一个k(数据保证:N小于等于10,k不大于10000不小于3)。

输出

每行一个结果,若是输出yes,否则输出no。

样例输入

3
4
36
72

样例输出

yes
yes
no

分析:前提要求的是质因数,所以要先找到10000以内的指数,可以先进行素数打表。然后对输入的数进行素数从小到大相除,每次相除后检测此数作为质因数的此数是否大于2,如果大于2,直接结束输出no,否则继续相除,直到为1,如果仍然符合条件则输出yes

如果有更好的方法,恳请指出!

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int a[10002],b[10000],c[10000],len=0,ans=0;
	memset(a,0,sizeof(a));
	
	for(int i=2;i<10000;i++)//素数打表
	{
		if(a[i]==0)
		for(int j=i+i;j<10000;j=j+i)
		{
			a[j]=1;
		}	
	}
	for(int i=2;i<10000;i++)
	{
		if(a[i]==0)
		b[++len]=i;
	}
	int n,e,t=1;cin>>n;
	while(n--)
	{
		cin>>e;
		t=1;ans=0;
		memset(c,0,sizeof(c));
		while(e!=1)
		{
			if(e%b[t]==0)
			{
				e=e/b[t];
				c[b[t]]++;
				if(c[b[t]]>2)//如果质因数作除数数量大于2直接结束
				{
					ans=1;break;
				}
			}
			else
			t++;
		}
		if(ans==1)
		cout<<"no"<<endl;
		else
		cout<<"yes"<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/basketball616/article/details/85764443