题目概述:整数分解问题
思路分析:任何一个数n都可以写成n=p1^a1*p2^a2*...*pm^am(其中p1,p2,..,pm为n的素因子)
方法一:
把所有可能的因数拿来试除,注意一个合数n的最大素因子不会超过sqrt(n)(除了n本身外);
#include<stdio.h>
#include<math.h>
void f(long long n){
for(long long i=2;i<=(int)sqrt(n+0.5);i++){
while(n%i==0){
n=n/i;
for(int j=0;j<4;j++)
printf(" ");
printf("%lld\n",i);
}
}
if(n>1){
for(int i=0;i<4;i++)
printf(" ");
printf("%lld\n",n);
}
}
int main(){
long long n;
while(scanf("%lld",&n)==1){
if(n<0)
break;
f(n);
printf("\n");
}
return 0;
}
方法二:
先建立素数表,再用输入的数对素数表依次试除;
这里建立的素数表使用了线性筛选法,关键的思想是每个合数必有一个最小素因子,保证每个合数都是被它的的最小素因子筛去,并只筛依一次,防止合数重复访问。
#include<stdio.h>
#include<math.h>
#include<string.h>
const int maxn=1000000;
int prime[maxn/3];
int flag[maxn];
int cnt;
void Prime(){
cnt=0;
memset(flag,0,sizeof(flag));
flag[0]=1;
flag[1]=1;
for(int i=2;i<maxn;i++){
if(!flag[i])
prime[cnt++]=i;
for(int j=0;i*prime[j]<maxn;j++){
flag[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
void f(long long n){
for(int i=0;i<cnt;i++){
if(n==1||n<prime[i])
break;
while(n%prime[i]==0){
n/=prime[i];
printf(" %d\n",prime[i]);
}
}
if(n>1) printf(" %lld\n",n);
}
int main(){
Prime();
long long n;
while(scanf("%lld",&n)==1){
if(n<0)
break;
f(n);
printf("\n");
}
return 0;
}