素因子
Description
我们知道,任何一个大于1的数,都可以写成多个素数的乘积,我们把这些素数叫做这个数的素因子。
Input
第一行为测试数据的组数N,
以下N行,每行一个数字k(1<k<2^24)
Output
输出N行,每行两个数字,一个是k的最大素因子,第二个是k的素因子的个数。
Sample Input
3
10
25
120
Sample Output
5
2
5
1
5
3
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
bool a[2100]={0};
int num[600];
int main()
{
int n,m,count=0;
int t =(int ) sqrt( 4200 );
for (int i=3;i<t;i+=2) //素数的筛选
{
if(a[i/2])
continue;
for(int j=i*i; j<=4200;j+=i<<1)
a[j/2]=1;
}
num[++count]=2;
for( int i=1;i<2100;i++ )
{
if( a[i]==0 )
num[ ++count ]=(i<<1)+1;
}
scanf("%d",&n);
for(int i=0; i< n; i++ )
{
int sum=0,x;
scanf( "%d",&m );
int j=1,flag;
while( j<=count )
{
flag=0;
while(!(m%num[j]))
{
if(!flag)
sum++;
x=num[j];
flag=1;
m/=num[j];
}
if(m==1)
break;
j++;
}
if( m>1 )
{
sum++;
x=m;
}
printf( "%d %d\n",x,sum );
}
return 0;
}
#include<stdlib.h>
#include<math.h>
bool a[2100]={0};
int num[600];
int main()
{
int n,m,count=0;
int t =(int ) sqrt( 4200 );
for (int i=3;i<t;i+=2) //素数的筛选
{
if(a[i/2])
continue;
for(int j=i*i; j<=4200;j+=i<<1)
a[j/2]=1;
}
num[++count]=2;
for( int i=1;i<2100;i++ )
{
if( a[i]==0 )
num[ ++count ]=(i<<1)+1;
}
scanf("%d",&n);
for(int i=0; i< n; i++ )
{
int sum=0,x;
scanf( "%d",&m );
int j=1,flag;
while( j<=count )
{
flag=0;
while(!(m%num[j]))
{
if(!flag)
sum++;
x=num[j];
flag=1;
m/=num[j];
}
if(m==1)
break;
j++;
}
if( m>1 )
{
sum++;
x=m;
}
printf( "%d %d\n",x,sum );
}
return 0;
}