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

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

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

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

Q&A

解決済

2回答

681閲覧

【競技プログラミング】long型にしてもエラーが起きる

junpeihamasaki

総合スコア7

Java

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

0グッド

0クリップ

投稿2019/10/27 14:01

前提・実現したいこと

競技プログラミングatcoderのC問題(https://atcoder.jp/contests/abc144/tasks/abc144_c)の入力例で10000000019を入力するとlong型でコードを書いたつもりがループしてしまいます。どこが間違っているのでしょうか?

発生している問題・エラーメッセージ

cmdがフリーズ、atcoderのコードテストも何も出ませんでした。実行時間も超過してしまいました。

該当のソースコード

Java

1import java.util.*; 2public class Main { 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 long N = sc.nextLong(); 6 ArrayList<Long> a = new ArrayList<Long>(); 7 ArrayList<Long> b = new ArrayList<Long>(); 8 long t = 0; 9 long g = 0; 10 for (long i = 1;i < N;i++) { 11 if (N%i == 0) { 12 t = i; 13 g = N/i; 14 a.add(t); 15 b.add(g); 16 } 17 } 18 int c = 0; 19 int i = 0; 20 long S[] = new long[a.size()]; 21 while (c < a.size()) { 22 S[i] = a.get(i)+b.get(i); 23 i++; 24 c++; 25 } 26 Arrays.sort(S); 27 System.out.println((long)S[0]-2); 28 } 29}

試したこと

調べたところlong型を使用するときに数字の末尾にLを付けるとあったのですがスキャナーでは付けれませんでした。
BigIntegerも試しましたが、よくわかりませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純に割り算に時間がかかります。
実験:Ideoneでの実行結果
単純に試し割りしていくだけでも5秒以上かかってしまいます。
割り算の回数を減らす工夫をする必要があります。
一般に整数nがabで表せるなら、baでも表せます。
この大小関係は√nを境に入れ替わるので、√n以下の整数で試し割りすればいいことになります。

投稿2019/10/27 14:17

swordone

総合スコア20651

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

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

junpeihamasaki

2019/10/27 14:37

詳しい回答ありがとうございます 計算についての理解が浅かったので気を付けます。
swordone

2019/10/27 16:13

なお、 > 調べたところlong型を使用するときに数字の末尾にLを付けるとあったのですが これは整数リテラル(プログラム上に直接記述する数)の場合の話です。メソッドなどでその必要は無いです。 また、0<a<bでa*b=n(一定)の条件下では、a+bの値はaが√nに近いほど小さくなります。
guest

0

単に遅すぎてダメというだけだと思います.

投稿2019/10/27 14:21

jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問