【遇见时光】笔试-大的奇约数-java
题目f(x)是x的最大奇偶数,f(44)=11,f(3)=3;
例如N=7;输出f(1)+f(2)+f(3)+f(4)+f(5)+..+f(7)=1+1+3+1+5+3+7=21
输入一个N,求f(1)+f(2)+f(3)+...+f(N)
思路:因为编译器有很高的时间限制,所以在程序里求约数时从2开始求会超时。换种思路考虑,奇数最大奇约数即它本身,主要求偶数的奇约数;一般来说n的约数以sqrt(n)为界,取i=1至sqrt(n),约数要么是i,要么是n/i;大部分数据的最大奇约数都在n/i中,但是如12=3*4,sqrt(12)=3,n/i取不到最大奇约数3,但是可以发现3是12的约数存在于i中。
所以代码如下:
1 package test; 2 3 import java.util.Scanner; 4 5 public class maxQishu { 6 public static int MaxYueshu(int n) { 7 // 奇数直接返回 8 if ((n & 1) == 1) 9 return n; 10 int i = 0; 11 int s=(int) Math.sqrt(n); 12 // max存第一个最大的约数i 13 int max=0; 14 int k=0; 15 for (i =(int) Math.sqrt(n) ; i >0; i--) { 16 if (n % i == 0){ 17 if((i&1) == 1&&(i>max)) 18 max=i; 19 k=n / i; 20 if((k &1) == 1){ 21 break; 22 } 23 } 24 } 25 if(i==0) k=1; 26 return max>k?max:k; 27 } 28 29 public static void main(String[] args) { 30 // TODO Auto-generated method stub 31 32 Scanner in = new Scanner(System.in); 33 int n = in.nextInt(); 34 int r = 0; 35 36 long startTime=System.currentTimeMillis(); //获取开始时间 37 38 for (int i = 1; i <= n; i++) { 39 // if((i &1) == 0) 40 // System.out.println("-----"+i+"\t"+MaxYueshu(i)); 41 r = r + MaxYueshu(i); 42 43 } 44 // System.out.println(MaxYueshu(15)); 45 System.out.println(r); 46 47 long endTime=System.currentTimeMillis(); //获取结束时间 48 49 System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 50 } 51 }
结果:
30000
250635784
程序运行时间: 26ms
可以看出用这种方法运行速度非常快。牛客网提示超时;说明nlogn算法不行;考虑用递归实现吧,参见大神之作http://www.cnblogs.com/wangxiaobao/p/5866351.html