質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

942閲覧

java言語 時間制限がうまくいきません。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/07/30 09:29

今、素数を時間内に無限に出力するプログラムを作成していて、30秒間で出力を強制終了させたいのですがうまく30秒間で終了しません。どこを直せばいいか教えていただけませんか。

ここに質問の内容を詳しく書いてください。```ここに言語を入力
コード

import

1 2public class 練習1 { 3 4 public static void main(String args[]) { 5 long start = System.currentTimeMillis(); 6 long dcnt=0; // 秒数表示記録(同じ秒数を何回も表示させないため) 7 long curtime=0; // 現在時刻記録 8 long end=30; // 実行時間(秒) 9 10 int num = 200000000; 11 12 13 14 int cnt = 0; 15 while (System.currentTimeMillis() <= start+end*1000) 16 { 17 curtime=System.currentTimeMillis(); 18 if(((curtime-start)/1000)%2==0 && dcnt!=(curtime-start)/1000) { 19 System.out.println((System.currentTimeMillis()-start)/1000 + "秒経過"); 20 dcnt=(curtime-start)/1000; 21 } 22 List<Integer> primes =isprime2(num); 23 for (int v : primes) { 24 System.out.println(v + " "); 25 26 cnt++; 27 28 29 } 30 } 31 System.out.println("素数の個数:"+cnt); 32 33 System.out.println("実行時間:"+ (curtime-start)/1000.0 + "秒"); 34 } 35 public static List<Integer> isprime2(int num) { 36 37 38 final List<Integer> list = new ArrayList<Integer>(); 39 if (num < 2) { 40 return list; 41 } 42 43 final boolean[] sieve = new boolean[num + 1]; 44 sieve[2] = true; 45 list.add(2); 46 47 for (int i = 3; i <= num; i += 2) { 48 sieve[i] = true; 49 } 50 51 52 for (int i = 3; i <= num; i += 2) { 53 if (sieve[i]) { 54 list.add(i); 55 for (int j = i * 2; j <= num; j += i) { 56 sieve[j] = false; 57 } 58 } 59 } 60 61 return list; 62 } 63 64}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

退会したか・・・

スレッド使えばできるけど。
このままだと例外発生する可能性あるけど退会してるから、まぁいいか。

java

1 final List<Integer> primes = new ArrayList<Integer>(); 2 int cnt = 0; 3 4 // isprime2 のメソッド run で実行 5 Thread myThread = new Thread() { 6 @Override 7 public void run() { 8 final boolean[] sieve = new boolean[num + 1]; 9 sieve[2] = true; 10 primes.add(2); 11 12 for (int i = 3; i <= num; i += 2) { 13 sieve[i] = true; 14 } 15 16 for (int i = 3; i <= num; i += 2) { 17 if (sieve[i]) { 18 primes.add(i); 19 for (int j = i * 2; j <= num; j += i) { 20 sieve[j] = false; 21 } 22 } 23 } 24 } 25 26 }; 27 // スレッド処理開始 28 myThread.start(); 29 30 // 指定時間秒のチェック 31 while (System.currentTimeMillis() <= start + end * 1000) { 32 curtime = System.currentTimeMillis(); 33 if (((curtime - start) / 1000) % 2 == 0 && dcnt != (curtime - start) / 1000) { 34 System.out.println((System.currentTimeMillis() - start) / 1000 + "秒経過"); 35 dcnt = (curtime - start) / 1000; 36 } 37 } 38 // 処理の中断 上記のループを抜けたので終了時間を経過している 39 myThread.interrupt(); 40 41 for (int v : primes) { 42 System.out.println(v + " "); 43 cnt++; 44 } 45 System.out.println("素数の個数:" + cnt); // primes.size() で可 46 47 System.out.println("実行時間:" + (curtime - start) / 1000.0 + "秒"); 48 } 49

投稿2020/07/30 11:37

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

isprime2 の実装が、指定した数までの素数を全部列挙するという実装になっているため、
実行時間を制御するwhileまで処理が戻ってきていません。
疑似コードで表現すると以下のような感じです。

while (実行制限時間内なら) { 素数を列挙する(200000000まで) }

というロジックになっているので、実行時間の制限が効果のない状態になっています。
なので、素数かどうかを1ループで1個チェックするようなロジックに変更する必要があります。

素数かチェックする数 = 1; while (実行制限時間内なら) { if 素数か判定(素数かチェックする数) { 素数リストに追加 } 素数かチェックする数++; }

投稿2020/07/30 09:56

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/30 10:10

指定した数までの素数を列挙するという実装では時間制限を設定することができないのでしょうか?
YakumoSaki

2020/07/30 10:18

指定した数までの素数を列挙する部分に時間制限がかからないので無理です。 ようするに、isprime2が処理が完了するまで戻ってこないのでどうにもならないです。
退会済みユーザー

退会済みユーザー

2020/07/30 10:46

そうなんですね。わかりやすい説明ありがとうございます。助かりましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問