求一个数的质因子
代码:
#include<stdio.h>
int main()
{
long long a[100],num,i,n;
while(~scanf("%I64d",&n))
{
num=0;
for(i=2; i*i<=n; i++)
{
if(n%i==0)
a[num++]=i;
while(n%i==0)
n/=i;
}
if(n>1)
a[num++]=n;
for(i=0; i<num; i++)
printf("%I64d ",a[i]);
printf("\n");
}
return 0;
}
#include<stdio.h>
#include<string.h>
long long a[1000000];
int main()
{
long long i,j,n;
scanf("%I64d",&n);
memset(a,0,sizeof(a));
for(i=2; i<100000; i++)
if(!a[i])
for(j=2*i; j<=n; j+=i)
a[j]=1;
for(i=2; i<=n; i++)
{
if(!a[i]&&n%i==0)
printf("%I64d ",i);
}
return 0;
}
第二个是我直接筛法写的,但是这样子的时间复杂度好像有点高,
定理:
算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如:
算术基本定理的内容由两部分构成:
分解的存在性;
分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的。
看过百度后感觉是好了一点,下面该欧拉函数了。
欧拉函数,就是求出不大于n且与n互素的数的个数
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,m;
while(~scanf("%d",&n))
{
if(n==1)
printf("0\n");
else
{
m=sqrt(n+0.5);
int ans=n;
for(i=2; i<=m; i++)
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
ans=ans/n*(n-1);
printf("%d\n",ans);
}
}
return 0;
}
这个其实就是求一个数的质因数的变形(只不过是加了一点内容)就是欧拉函数的一个公式。
公式:
利用欧拉函数和它本身不同质因数的关系,用
筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:
欧拉函数ψ(N)=N{∏p|N}(1-1/p)

亦即:
(P是数N的
质因数)
直接代入公式就好了,对了,这一点,它还使用了一个开方向下取整的小细节,请教大神,说在1e9内都是没有问题的,这个我也没有求证,以后求证过了再补,(
m=sqrt(n+0.5))还有容斥原理,有时间再写吧。
