算数基本定理+容斥原理(的应用)

本文介绍了算术基本定理(唯一分解定理),阐述了如何利用该定理解决计算自然数因子个数的问题。虽然传统方法可能导致超时,但文章提供了C语言代码作为示例。同时,提到了一个相关的例题,即求小于n且与n互质的数的数量,其中n不超过10亿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算术基本定理(唯一分解定理)

一句话:
    
任何大于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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值