[英]Error in taking input from the BufferedReader
我被問到一個關於找到兩個數字之間的公約數的問題。 我能夠使用“埃拉托色尼篩法”找出邏輯方法,並且我正在干運行我的代碼。 但是我的代碼給出了一個意想不到的輸出,因為它能夠找出不。 兩個數之間的公約數。 對於第一個輸入,但對於其他輸入,它以某種方式繼續使用“內部循環 j”的先前值,在第一個測試用例中它停止; 對於其他測試用例。
邏輯方法--> 如果一個素數沒有。 是給定兩個 nos 的因子。 然后我們將檢查素數的每個倍數。(使用素數[]數組並轉換素數[]=0的倍數的值)其中一些是否是這兩個數字的倍數,如果是,則我們將值增加 1。
我的問題是 - 以錯誤的方式使用 BufferedReader 或者代碼本身存在一些錯誤
問題鏈接-> https://www.geeksforgeeks.org/common-divisors-of-two-numbers/
輸入格式 輸入的第一行包含一個整數 T,表示測試用例的數量。
T 測試用例的描述如下。
每個測試用例的第一行包含兩個整數 A 和 B 。
輸出格式對於每個測試用例,在單獨的行上輸出給定對之間的公約數。
約束 1 ≤ T ≤ 10 ^2
1 ≤ A , B ≤ 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)。 為什么會這樣?
很簡單,因為你的程序失誤檢查所有primes
,其是>的sqrt(分鍾),並且這兩個數字的因素。
為了糾正這個問題,您需要在最后以線性方式檢查這些素數的可分性,如下所示,但這將是低效的。
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[i]=0
。
此外, primes
數組的初始化應該在每個測試用例中完成,就像在前面的測試用例中一樣, primes
數組會被修改。
primes[] = new long[1000005];
for(int i=2; i<=100000; i++)
primes[i] = 1;
有關有效方法,請參閱您分享的 GFG 文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.