题目:给你一个数字n,将它因式分解。
分析:简单题、数论。因为数据范围是-2^31 ~ 2^31所以n的素数因子在区间[sqrt(n),n]上最多有1个;
所以计算[0,sqrt(n)]上的所有素数因子,除n剩下的部分不是1,就是那个最大的质因数了。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int visit[46340];
int prime[46340];
int main()
{
//打表计算素数
for ( int i = 0 ; i < 46340 ; ++ i )
visit[i] = 1;
int count = 0;
for ( int i = 2 ; i < 46340 ; ++ i )
if ( visit[i] ) {
prime[count ++] = i;
for ( int j = 2*i ; j < 46340 ; j += i )
visit[j] = 0;
}
long n;
while ( ~scanf("%ld",&n) && n ) {
printf("%ld =",n);
int first = 1;
if ( n < 0 ) {
printf(" -1");
first = 0;
n *= -1;
}
for ( int i = 0 ; n > 1 && i < count ; ++ i )
while ( n%prime[i] == 0 ) {
if ( first ) {
printf(" %d",prime[i]);
first = 0;
}else printf(" x %d",prime[i]);
n /= prime[i];
}
//输出大于46340的素数
if ( n != 1 ) {
if ( first ) printf(" %d\n",n);
else printf(" x %d\n",n);
}else printf("\n");
}
return 0;
}