【问题标题】:Error in taking input from the BufferedReader从 BufferedReader 获取输入时出错
【发布时间】:2021-07-01 08:16:10
【问题描述】:

有人问我一个关于找出两个数之间的公约数的问题。我能够使用“Sieve of Eratosthenes”找出逻辑方法,并且我正在干运行我的代码。但是我的代码给出了一个意想不到的输出,因为它能够找出答案。两个数之间的公约数。对于第一个输入,但对于其余部分,它以某种方式继续使用“inner loop j”的先前值,在该值处它为第一个测试用例停止;用于其他测试用例。

逻辑方法 --> 如果是素数。是给定两个数的一个因素。然后我们将检查每个素数的倍数。(使用素数[]数组并转换素数[]=0的倍数)其中一些是否是两个数字的倍数,如果是,那么我们将值增加 1。

我的问题是 - 以错误的方式使用 BufferedReader 或者代码本身存在一些错误

问题链接-> https://www.geeksforgeeks.org/common-divisors-of-two-numbers/

输入格式 输入的第一行包含一个整数 吨 表示测试用例的数量。

描述 吨 测试用例如下。

每个测试用例的第一行包含两个整数 一个 和 乙 .

输出格式 对于每个测试用例,在单独的行上输出给定对之间的公约数的数量。

约束 1 ≤ 吨 ≤ 10 ^2

1 ≤ 一个 , 乙 ≤ 10 ^9

示例 输入

3

100000 100000

12 24

747794 238336

预期输出

36

6

2

try{
        
        long primes[]=new long[1000005];
                for(int i=2;i<=100000;i++){
                        primes[i]=1;
                }
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                int t = Integer.parseInt(br.readLine());
                for(int k=0;k<t;k++){
                        String s = br.readLine();
                        String s2[] = s.split(" ");
                        long a = Long.parseLong(s2[0]);
                        long b = Long.parseLong(s2[1]);
                        
                        long min = Math.min(a,b);
                        long max= Math.max(a,b);
                        System.out.println("Value of max = "+max);
                        System.out.println("Value of min = "+min);
                        long count=1;
                        for(int i=2;i*i<=min;i++){
                                if(primes[i]==1){
                                    System.out.println("Value of i = "+i);
                                        if(max%i==0 && min%i==0){
                                                count++;
                                        }
                                        for(int j=i;j*i<=min;j++){
                                                if(primes[i*j]==1){
                                                   
                                                        primes[i*j]=0;
                                                         System.out.println("Value of j = "+j);
                                                        if((max%(i*j)==0) && (min%(i*j)==0)){
                                                            
                                                                count++;
                                                        }
                                                }
                                        }
                                }
                        }
                        System.out.println(count);
                }
    }catch(Exception e){
        return;
    }
    

不同输入值的输出 -

Value of max = 24
Value of min = 12
Value of i = 2
Value of j = 2
Value of j = 3
Value of j = 4
Value of j = 5
Value of j = 6 <------
Value of i = 3
Value of j = 3
6
Value of max = 40
Value of min = 20
Value of i = 2
Value of j = 7  <------
Value of j = 8
Value of j = 9
Value of j = 10
Value of i = 3
Value of j = 5
3
Value of max = 100
Value of min = 20
Value of i = 2
Value of i = 3
2

我怎样才能找出错误?我是使用 BufferedReader 的新手?

【问题讨论】:

  • 这是一个算法问题。我认为每次获得新输入时都应该将primes 数组重置为全1,就在br.readLine() 之后。缓冲阅读器根本不是问题。但是,您没有正确关闭它。查找“try-with-resources”。
  • 是的,我发现我的代码可以正常工作,我需要为每个测试用例创建新的 primes[],这对于非常庞大的测试用例(效率非常低)。谢谢!!

标签: java bufferedreader


【解决方案1】:

你的算法是错误的。 BufferedReader 工作正常。 举个简单的例子,比如a=131b=262,你的程序会返回 1 作为答案,但正确的答案是2 (1 & 131)。为什么会这样?
仅仅是因为您的程序错过了检查所有大于 sqrt(min) 并且是两个数字的因素的 primes
为了纠正这个问题,您需要在最后以线性方式检查这些素数的可分性,如下所示,但这将是低效的。

for (int i=2; i<=min; i++)
    if (primes[i] == 1 && (max%(i)==0) && (min%(i)==0))
        ++count;

此外,为了上述的正确工作,您需要在每次 i-th 迭代期间将 i-th 数字标记为由 primes[i]=0 合成。
此外,primes 数组的初始化应该在每个测试用例中完成,就像在前面的测试用例中一样,primes 数组将被修改。

primes[] = new long[1000005];
    for(int i=2; i<=100000; i++)
        primes[i] = 1;

有关有效方法,请参阅您分享的 GFG 文章。

【讨论】:

  • 是的,我发现我的代码可以正常工作,我需要为每个测试用例创建新的 primes[],这对于非常庞大的测试用例(效率非常低)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
相关资源
最近更新 更多