U - Relatives(欧拉函数)

本文深入探讨了欧拉函数的定义与计算方法,通过一个典型编程问题,讲解了如何利用欧拉函数求解不大于n且与n互质的正整数个数。文章提供了详细的AC代码实现,并解释了其背后的数学原理。

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

Description

Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.

Input

There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.

Output

For each test case there should be single line of output answering the question posed above.

Sample Input
7
12
0

Sample Output
6
4

解题思路:欧拉函数:求不大于n且与n互质的数的个数。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int Euler(int x){
 4     int r=x;
 5     for(int i=2;i*i<=x;i++){//由于任何一个合数都至少有一个不大于根号x的质因子,所以只需遍历到根号x即可
 6         if(x%i==0){
 7             r=r/i*(i-1);//欧拉函数的通式,先除后乘,避免数据溢出
 8             while(x%i==0)x/=i;//消除x中所有质因子i,直到不能被i整除
 9         }
10     }
11     if(x>1)r=r/x*(x-1);//如果x大于1,说明还有一个质因子没有除掉
12     return r;//返回个数
13 }
14 int main(){
15     int n;
16     while(cin>>n&&n)
17         cout<<Euler(n)<<endl;
18     return 0;
19 }

 

转载于:https://www.cnblogs.com/acgoto/p/9317225.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值