結果
| 問題 |
No.955 ax^2+bx+c=0
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-18 01:06:52 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,122 bytes |
| コンパイル時間 | 2,472 ms |
| コンパイル使用メモリ | 79,824 KB |
| 実行使用メモリ | 56,380 KB |
| 最終ジャッジ日時 | 2024-07-07 00:07:41 |
| 合計ジャッジ時間 | 21,798 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 92 WA * 30 |
ソースコード
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.*;
import java.io.*;
import java.math.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
long b = sc.nextLong();
long c = sc.nextLong();
// for (long a = -10; a <= 10; ++a)
// for (long b = -10; b <= 10; ++b)
// for (long c = -10; c <= 10; ++c)
new Main().run(a, b, c);
}
void run(long a, long b, long c) {
if (a < 0) {
a *= -1;
b *= -1;
c *= -1;
}
if (a == 0 && b == 0 && c == 0) {// 0x^2+0x+0=0
System.out.println(-1);
return;
} else if (a == 0 && b == 0 && c != 0) {// 0x^2+0x+c=0
System.out.println(0);
} else if (a == 0) {// 0x^2+bx+0=0
System.out.println(1);
System.out.println((double) c / a);
} else if (a != 0) {
long DD = b * b - 4 * a * c;
if (DD < 0) {
System.out.println(0);
} else if (DD == 0) {
System.out.println(1);
System.out.println((double) (-b) / (2 * a));
} else {
System.out.println(2);
System.out.println(BigDecimal.valueOf(-b).subtract(sqrt(new BigDecimal(DD), 50))
.divide(BigDecimal.valueOf(2 * a), BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(BigDecimal.valueOf(-b).add(sqrt(new BigDecimal(DD), 50))
.divide(BigDecimal.valueOf(2 * a), BigDecimal.ROUND_HALF_UP).doubleValue());// (double)(-b+Math.sqrt(DD))/(2*a));
}
}
// BigDecimal s2_50 = sqrt(new BigDecimal(2), 50);
// System.out.println(s2_50);
// System.out.println(s2_50.multiply(s2_50));
}
void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
public static BigDecimal sqrt(BigDecimal a, int scale) {
// とりあえずdoubleのsqrtを求める
BigDecimal x = new BigDecimal(Math.sqrt(a.doubleValue()), MathContext.DECIMAL64);
if (scale < 17)
return x;
BigDecimal b2 = new BigDecimal(2);
for (int tempScale = 16; tempScale < scale; tempScale *= 2) {
// x = x - (x * x - a) / (2 * x);
x = x.subtract(x.multiply(x).subtract(a).divide(x.multiply(b2), scale, BigDecimal.ROUND_HALF_EVEN));
}
return x;
}
}