//
// main.cpp
// 质因数分解
//
// Created by 张嘉韬 on 16/7/21.
// Copyright © 2016年 张嘉韬. All rights reserved.
//
解法一:直接找到因子,然后除尽
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=100000;
int factor[maxn];
int counter;
void divide (int n)
{
counter=0;
for(int i=2;i<=sqrt(n+0.0);i++)
if(n%i==0)
while(n%i==0)
{
factor[++counter]=i;
n=n/i;
}
if(n!=1) factor[++counter]=n;
}
int main(int argc, const char * argv[]) {
int n;
cin>>n;
cout<<"n=";
for(int i=1;i<=counter;i++)
{
if(i!=1) cout<<"*";
cout<<factor[i];
}
cout<<endl;
return 0;
}
解法二:制作素数表,然后遍历素数因子
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=100000;
int nprime,prime[maxn],isprime[maxn],counter,factor[maxn];
void make_prime()
{
nprime=0;
memset(isprime,1,sizeof(isprime));
for(int i=2;i<=sqrt(maxn)+0.0;i++)
{
if(isprime[i])
{
prime[++nprime]=i;
for(int j=i*i;j<maxn;j+=i) //why from i^2
{
isprime[j]=0;
}
}
}
}
void divide(int n)
{
for(int i=1;i<=nprime;i++)
{
cout<<prime[i]<<" "<<n<<endl;
if(prime[i]>n) break;
while(n%prime[i]==0)
{
factor[++counter]=prime[i];
n/=prime[i];
}
}
if(n!=1) factor[++counter]=n;
}
int main()
{
make_prime();
int n;
cin>>n;
divide(n);
cout<<"n=";
for(int i=1;i<=counter;i++)
{
if(i!=1) cout<<"*";
cout<<factor[i];
}
return 0;
}