微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何优化Java中计算Pronic数的解决方案

如何解决如何优化Java中计算Pronic数的解决方案

最近,在其中一项评估中,我遇到了这个问题: 给定两个整数 A 和 B,返回 A..B 范围内的整数个数,可以表示为两个连续整数的乘积,即 X *(X + 1),也称为 Pronic Number。>

示例 1:

A = 6 和 B = 20,函数应该返回 3,这些整数是 6 = 2 * 3、12 = 3 * 4 和 20 = 4* 5

示例 2:

A = 21 和 B = 29,函数应该返回 0

假设:

  1. A 和 B 是 [1...1000,000,000] 范围内的整数
  2. A

对于 1000,000 的极端输入,我的解决方案失败了。我收到超出时间限制的错误。 有人可以帮我进一步优化我的代码吗?

    // Java program to check if a number is pronic or not 

import java.io.*; 
import java.util.*; 
import java.math.*; 

class solution 
{ 

    // Function to check Pronic Number 
    static int pronic_check(int A,int B) 
    { 
        int count = 0;
        for (int i = A; i <= B; i++){
            if (i % 2 == 0)      // a pronic number is always even
            {
                int x = (int)(Math.sqrt(i));
                if (x * (x + 1) == i) 
                    count++; 
            }
        }

        return count;
    } 
    
    public static void main(String[] args) 
    {    
        System.out.println(pronic_check(5000,990000000));
    } 
} 

提前致谢。

解决方法

如果您只需要计数。我想这个对你来说是最好的。

说明: 让我们假设,A=6 B=20。 现在,start=sqrt(A)= 2end = sqrt(20) = 4 。最初count = (end-start-1)。在这里,您只需要检查 startend。如果 (end*(end+1))<= B 则只需将 count 增加一。还要检查是否 (start*(start+1) >= A) 然后将 count 增加一。所以,这里是 count = 3

这里的时间复杂度将是常数 O(1)

import java.io.*; 
import java.util.*; 
import java.lang.Math; 

class solution 
{ 
   // Function to check Pronic Number 
    static int pronic_check(int A,int B) 
    { 
        int count = 0;
        int start =  (int) Math.sqrt(A); 
        int end = (int) Math.sqrt(B);
        count = (end -start -1 );
        if (start*(start+1) >= A) {
            count++;
        }
        if (end*(end+1) <= B){
            count++;
        } 

        return count;
    } 
    
    public static void main(String[] args) 
    {    
        System.out.println(pronic_check(5000,990000000));
    } 
} 
,

@H.R. Emon 感谢您提供直观的解决方案!

根据您的想法,我尝试稍微修改解决方案。 我们可以求出(A-1)的Pronic Number的计数a_pronic_count,和B的Pronic Number的计数b_pronic_count,用b_pronic_count - a_pronic_count得到最终答案。 时间复杂度为 O(1)。

class solution
{
   public static int pronic_count(int A,int B){
       int a_cnt = count(A);
       int b_cnt = count(B);
    
       return b_cnt - a_cnt + 1;
   } 
   public static int count(int num){
       int n = (int)Math.sqrt(num);
    
       if (n*(n+1) == num) return n;
       return  n-1;
   }

   public static void main(String[] args) 
   {    
     System.out.println(pronic_count(1,1000000000));
   } 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。