3108: 牛数
Time Limit: 1 Sec Memory Limit: 128 MBDescription
我们下面来研究整数性质,我们知道质数只有1和自身两个因子,合数至少有除了1和自身的其他因子,我们也知道“猫老大数”是只能分解成两个质数乘积形式的数,那么能分解成两个合数的数呢?我们称之为“牛数”。下面编程判断整数是否为“牛数”。
Input
第一行为t(1≤t≤100),表示测试数据组数。
接下来t行,每行一个正整数x。
Output
对于每个输入数据x,判断它是否为“牛数”,并输出一行字符串:如果它是“牛数”,输出“cow”,否则输出“no”。
Sample Input
2
15
36
15
36
Sample Output
no
cow
cow
HINT
60%的数据:1≤x≤109
100%的数据:1≤x≤1012
#include<stdio.h>
bool notprime[1000001];
int prime[100001];
int idx;
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=1000000;i++)
/*‘先用线筛,初始化1到1000000中的质数’*/
{
if(!notprime[i])
prime[idx++]=i;
for(int j=0;j<idx&&i*prime[j]<=1000000;j++)
{
notprime[i*prime[j]]=true;
if(i%prime[j]==0)
break;
}
}
for(int k=1;k<=n;k++)
{
long long num;
scanf("%lld",&num);
int howmany=0,is=0;
for(int i=0;(long long)prime[i]*prime[i]<=num&&num!=1;i++)
/*‘直接调用初始化的质数’*/
{
while(num%prime[i]==0)
{
if(howmany>=3)
break;
howmany++;
num/=prime[i];
}
if(howmany==3&&num!=1)
{
printf("cow\n");
is=1;
break;
}
}
if(!is)
printf("no\n");
}
}