数学问题 | 质因数分解:1096
因为一个数最大的因数只能是Sqrt(x),所以对于int整数范围(1e9)内,最大的因数不会超过100000(1e5)。所以打一个素数表,然后进行质因数判断。
很经典的质因数分解题,只做了一点点改动,适合练习。
需要注意的是n=1的特殊情况判别。
AC代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100000 #define MAX (1<<30)-1 #define V vector<int> typedef long long ll; using namespace std; int prime[LEN]; int pLen=0; bool isPrime(int x){ if(x<=1) return 0; for(int i=2;i<=sqrt(x);i++){ if(x%i==0) return 0; } return 1; } void build_prime_list(){ int i; FF(i,LEN){ if(isPrime(i)){ prime[pLen++]=i; } } } int num[LEN]; int cnt[LEN]; int main(){ int n,len=0; n=97532468; I("%d",&n); if(n==1){ O("1=1"); return 0; } O("%d=",n); build_prime_list(); int i=0; while(n>1){ if(n%prime[i]==0){ num[len]=prime[i]; while(n%prime[i]==0){ n/=prime[i]; cnt[len]++; } len++; } i++; } FF(i,len){ O("%d",num[i]); if(cnt[i]>1){ O("^%d",cnt[i]); } if(i!=len-1) O("*"); } return 0; }