如何解决从 BufferedReader
我被问到一个关于找到两个数字之间的公约数的问题。我能够使用“埃拉托色尼筛网”找出逻辑方法,并且我正在干运行我的代码。但是我的代码给出了一个意想不到的输出,因为它能够找出不。两个数之间的公约数。对于第一个输入,但对于其他输入,它以某种方式继续使用“内部循环 j”的先前值,在第一个测试用例中它停止;用于其他测试用例。
逻辑方法 --> 如果是素数。是给定两个 nos 的因子。然后我们将检查素数的每个倍数。(使用素数[]数组并转换素数[]=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?
解决方法
你的算法是错误的。 BufferedReader
工作正常。
举个简单的例子,比如说a=131
,b=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
迭代期间通过 primes[i]=0
将 i-th
数字标记为复合。
此外,primes
数组的初始化应该在每个测试用例期间完成,就像在前面的测试用例中一样,primes
数组会被修改。
primes[] = new long[1000005];
for(int i=2; i<=100000; i++)
primes[i] = 1;
有关有效方法,请参阅您分享的 GFG 文章。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。