题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1164
题 意:将n分解为素因子的形势。
思 路:
一:将 素数打表再暴力求解。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <climits>
#include <algorithm>
#define maxn 65535
typedef __int64 LL;
int a[maxn];
int prime[maxn];
int main()
{
memset(a,1,sizeof(a));
for( int i = 2; i <= maxn; i ++ )
{
if( a[i] )
for( int j = i+i; j <= maxn; j += i )
a[j]=0;
}
int j = 0;
for( int i = 2; i < maxn; i ++ )
{
if( a[i] ) prime[j] = i,j++;
}
int n;
while( scanf ( "%d", &n ) != EOF )
{
int f = 1;
for( int i = 0; i < j; i ++ )
{
if( n == 1 ) break;
while( n%prime[i] == 0 )
{
if( f )
{
printf("%d",prime[i]);
f=0;
}
else printf("*%d",prime[i]);
n /= prime[i];
}
}
printf("\n");
}
return 0;
}
二: 打表后用DFS遍历求解。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <climits>
#include <algorithm>
#define maxn 65535
typedef __int64 LL;
int a[maxn], n, k;
int prime[maxn];
void DFS( int x )
{
if( x == 0 ) return ;
for( int i = 0; i < k; i ++ )
{
if( x%prime[i] == 0 )
{
printf( x==n?"%d":"*%d",prime[i] );
DFS( x/prime[i] );
break;
}
}
}
int main()
{
memset(a,1,sizeof(a));
for( int i = 2; i <= maxn/2; i ++ )
{
if( a[i] )
for( int j = i+i; j <= maxn; j += i )
a[j]=0;
}
k = 0;
for( int i = 2; i < maxn; i ++ )
{
if( a[i] ) prime[k++] = i;
}
while( scanf ( "%d", &n ) != EOF )
{
DFS( n );
printf("\n");
}
return 0;
}