【解決方法】UVA 13131:Java の除数 TLE

プログラミングQA


UVAの問題を解決しました: https://onlinejudge.org/external/131/13131.pdf[^]

私の解決策:

void solve(Scanner sc, int n, int k) {
        int sum=0;
        for(int i=1; i<=n; i++) {
            if(n%i==0 && i%k!=0)sum+=i;
        }
        System.out.println(sum);
}

UVAでTLEになりました。 TLEになるのは明らかでした。

だから、私は自分の解決策を最適化し、このように実装しようとしました:

void solve(Scanner sc, int n, int k) {
        int sum=0;
        for(int i=1; i*i<=n; i++) {
            if(n%i==0 && i%k!=0)sum+=i;
            if(n%(n/i)==0 && (n/i)%k!=0)sum+=(n/i);
        }
        System.out.println(sum);
    }

しかし、それでも私はTLEを取得しています。 ここで何が起こっているのかを理解するために、C++ で 2 番目のアプローチを実装し、受け入れられました。 しかし、Java では TLE を取得しています。 なぜこれが起こっているのかわかりませんし、ACを取得する方法もわかりません. 問題を解決するのを手伝ってくれるようにお願いしています.. 私は落ち込んでいます。Java が大好きです。問題解決のために C++ に移行したくありません。

私が試したこと:

Java の完全なコード:

import java.util.Scanner;
public class Main{
    void solve(Scanner sc, int n, int k) {
        int sum=0;
        for(int i=1; i*i<=n; i++) {
            if(n%i==0 && i%k!=0)sum+=i;
            if(n%(n/i)==0 && (n/i)%k!=0)sum+=(n/i);
        }
        System.out.println(sum);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Main main = new Main();
        
        int t = sc.nextInt();
        while(t-->0) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            main.solve(sc, n, k);
        }
        
    }
}
<pre>

コメント

タイトルとURLをコピーしました