算术基本定理(唯一分解定理)
一句话:
任何大于1的自然数,都可以唯一分解成有限个质数的乘积
一、求一个数有几个因子。比如求9有3个因子,就是1、3、9, 原因是1*9=9 3*3=9
这种方法一般都会超时
C语言的代码如下:
//求一个数有几个因子
#include<stdio.h>
#include<math.h>
int num(int n)
{
if(n==1) return 1;
int count=2;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
if(i*i==n&&n/i==i)//如果两因子相同,则加1
count++;
else count+=2;
}
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",num(abs(n)));//以防是负数,带上abs()
return 0;
}
二、求一个数的所有因子(不包括自身)的和
这种方法一般都会超时
//求一个数的所有因子(不包括自身)的和
#include<stdio.h>
int sum(int x)
{
int count=0;
for(int i=1; i<=x/2; i++)//循环判断条件是 <=x/2 而不是 <x,因为比x/2大的数是成不了因子的
{
if(x%i == 0)
{
count += i;
}
}
return count;
}
int main()
{
int n;
while(~scanf("%d",&n))
printf("%d\n",sum(n));
return 0;
}
例题 求小于n且和n互质的数有多少个 n<=1 000 000 000
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int v[maxn];
int main()
{
int t,n;
while(scanf("%d",&t)&&t)
{
int ss=1;n=t;
for(int i=2;i*i<=t;)
{
bool flag = false;
while(t%i==0)
{
if(!flag)
{
flag=true;
v[ss++]=i;
}t/=i;
}
if(i==2) i++;
else i += 2;
}
ll sum=0;
if(t!=1) v[ss++]=t;
ss-=1;
for(int i=1;i<(1<<ss);i++)
{
ll cnt=0,tmp = 1;
for(int j=1;j<=ss;j++)
{
if(i>>(j-1)&1)
{
cnt++;
tmp=tmp*v[j];
}
}
if(cnt&1) sum+=n/tmp;
else sum-=n/tmp;
}
printf("%d\n",n-sum);
}
return 0;
}