算法提高 欧拉函数

时间限制:1.0s 内存限制:512.0MB

说明

  2016.4.5 已更新试题,请重新提交自己的程序。

问题描述

  给定一个大于1,不超过2000000的正整数n,输出欧拉函数,phi(n)的值。

  如果你并不了解欧拉函数,那么请参阅提示。

输入格式

  在给定的输入文件中进行读入:

  一行一个正整数n。

输出格式

  将输出信息输出到指定的文件中:

  一行一个整数表示phi(n)。

样例输入

17

样例输出

16

提示

  欧拉函数phi(n)是数论中非常重要的一个函数,其表示1到n-1之间,与n互质的数的个数。显然的,我们可以通过定义直接计算phi(n)。

  当然,phi(n)还有这么一种计算方法。

  首先我们对n进行质因数分解,不妨设n=p1^a1 * p2^a2 * … * pk^ak (这里a^b表示a的b次幂,p1到pk为k个互不相同的质数,a1到ak均为正整数),那么

  phi(n)=n(1-(1/p1))(1-(1/p2))…(1-(1/pk))

  稍稍化简一下就是

  phi(n)=n(p1-1)(p2-1)…(pk-1)/(p1p2…*pk)

计算的时候小心中间计算结果超过int类型上界,可通过调整公式各项的计算顺序避免(比如先做除法)!

	import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class 欧拉函数 {
static int n;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
n=Integer.parseInt(br.readLine());
System.out.println(phi(n));
}
private static int phi(int n) {
// TODO Auto-generated method stub
int sum=n,x=n;
for(int i=2;i<=n/2+1;i++){
if(x%i==0){
sum=sum/i*(i-1);
while(x%i==0)
x=x/i;
}
}
if(sum==x)
sum=sum-1;
return sum;
} }

最新文章

  1. 彻底解决“从客户端中检测到有潜在危险的Request.Form值”
  2. ks
  3. 读javascript高级程序设计08-引用类型之Global、Math、String
  4. kafka_2.9.2-0.8.1.1分布式集群搭建代码开发实例
  5. 去掉iphone手机滑动默认行为
  6. ITaCS Change Password web part
  7. spring 定时任务的 执行时间设置规则
  8. js 中的闭包
  9. Git使用摘要
  10. Spring中的AOP开发
  11. 常见linux命令用法介绍
  12. Linux下查找大文件以及目录
  13. 验证SQLServer死锁进程
  14. LFYZ-OJ ID: 1019 位数问题
  15. ubuntu安装rabbitmq(转)
  16. exshop第6天
  17. バイナリハックイージー / Unhappy Hacking (ABC Edit) (stack)
  18. 用EXCEL的VBA将PHPCMS的备份文件转换成HTML的一次尝试
  19. DBA_实践指南系列3_Oracle Erp R12系统克隆Clone(案例)
  20. css多行文本省略号(...)

热门文章

  1. 房价预测Task1
  2. like模糊查询是否走索引
  3. 我的.vimrc配置
  4. OpenCv 学习安装(一)
  5. css概述五
  6. Django之ORM对象关系模型
  7. 三、HTML元素
  8. 还不会K8S吗?先从kubeadm开始吧
  9. Flutter “孔雀开屏”的动画效果
  10. 在树莓派里搭建 Lighttpd 服务器