Number数论
欧拉函数
1.1 分解质因数法
输出一个数的所有质因数,例如8 = 2 * 2 * 2;
思路就是从2开始找(2是最小的质数),如果n能被i整除,那么n /= i ( 更新 n ),如果 n 不能被i整除,说明 i 不是 n 的因子,那么 i 就继续往下找,直到 i 等于 n 。
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;//分解N
cout << n << " = ";
for(int i=2;i<=n;i++){//遍历小于等于n的所有数
while(i!=n){
if(n%i==0){
n /= i;//更新n,且保证i是质数
cout << i << " * ";//格式输出
}
else break;//如果不能整除就退出继续往下寻找
}
}
cout << n << endl;
return 0;
}
二
也可以用欧拉线性筛的方法先筛出一个素数表,然后对素数表中的内容进行遍历,处理方法类似于上面的第一个方法,代码奉上
#include<iostream>
#include<cstring>
using namespace std;
int prime[1000001];
int vis[10000001];
int cnt = 0;//统计素数的个数
int factor[1000][2];//factor[i][j]存放第i个素数出现的次数
void getprime(int n){//欧拉线性筛得到一个素数表
memset(vis,0,sizeof(vis));
for(int i=2;i<=n;i++){
if(!vis[i]) prime[cnt++] = i;
for(int j=0;j<=cnt;j++){
vis[i*prime[j]] = 1;
if(i%prime[j] == 0) break;
}
}
}
void getfactor(int n){//合数分解
int count = 0;
for(int i=0;prime[i]<=n;i++){
if(n%prime[i]==0){
while(n%prime[i]==0){
factor[count][0] = prime[i];
factor[count][1]++;
n /= prime[i];
}
count++;
}
}
factor[count][1]++;
for(int i=0;i<count;i++){
cout << factor[i][0] << " " << factor[i][1] << endl;
}
}
int main(){
int n;
cin >> n;
getprime(n);
for(int i=0;i<cnt;i++){
cout << prime[i] << " ";
}
cout << endl;
getfactor(n);
return 0;
}