标签:
整数分解,又称质因子分解。在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式。
1.试除法(适用于范围比较小)
无论素数判定还是因子分解,试除法(Trial Division)都是首先要进行的步骤。令m=n,从2~根n一一枚举,如果当前数能够整除m,那么当前数就是n的素数因子,并用整数m
将当前数除尽为止。
若循环结束后m是大于1的整数,那么此时m也是n的素数因子。
事例如HDU1164:15mm
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define N 65535 using namespace std; int factor[N],top; void divide(int n) { for(int i=2; i<=sqrt(n+0.0); i++) { while(n%i==0) { top++; factor[top]=i; n/=i; } } if(n!=1) { top++; factor[top]=n; } for(int i=1; i<=top-1; i++) { printf("%d*",factor[i]); } printf("%d\n",factor[top]); return ; } int main() { int n; while(scanf("%d",&n)!=EOF) { top=0; divide(n); } return 0; }
2.筛选法对整数分解
试除法进行了许多不必要的运算,先将2~根n的所有素数打表,然后对应素数表一一试除将会大大节约时间。
事例如HDU1164:0mm
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define N 65540 using namespace std; int factor[N],top,cnt,prime[N]; bool b[N]; void make_prime() { top=0; b[0]=b[1]=false; b[2]=true; prime[++top]=2; for(int i=3; i<N; i++) if(i%2==0) b[i]=false; else b[i]=true; double t=sqrt(1000000*1.0); for(int i=3; i<=t; i++) { if(b[i]) { prime[++top]=i; for(int j=i*i; j<N; j=j+i) { b[j]=false; } } } } void divide(int n) { cnt=0; int temp=sqrt(n+0.0); for(int i=1; i<=top; i++) { if(prime[i]>temp) break; while(n%prime[i]==0) { cnt++; factor[cnt]=prime[i]; n/=prime[i]; } } if(n!=1) { cnt++; factor[cnt]=n; } for(int i=1; i<=cnt-1; i++) { printf("%d*",factor[i]); } printf("%d\n",factor[cnt]); return ; } int main() { int n; make_prime(); while(scanf("%d",&n)!=EOF) { divide(n); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhangmingcheng/p/4239855.html