簡體   English   中英

從 BufferedReader 獲取輸入時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM