/*
プログラミングのお題スレ Part11
https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1524570314/533
533 名前:デフォルトの名無しさん[sage] 投稿日:2018/06/22(金) 00:11:10.49 ID:3MP35Wby
お題:
ある数値nが与えられた時に、次の条件を満たす2つの数値a,bを求め、表示するプログラムを作成しなさい。
●aとbの最小公倍数がnとなる
●a<bかつaとbの差(b-a)が最小となる
例:n= 360→a= 36,b= 40
n=1000→a=125,b=200
例が間違ってたらゴメン
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main
{
static int[] prime = new int[65536];
static
{
boolean[] b = new boolean[65536];
for (int i = 2; i < 256; i++)
{
if (b[i]) continue;
for (int j = i * 2; j < b.length; j += i)
b[j] = true;
}
int size = 0;
for (int i = 2; i < 65536; i++)
{
if (!b[i]) prime[size++] = i;
}
prime
= Arrays.
copyOf(prime, size
); }
public static void main
(String[] args
) {
solve(360);
solve(1000);
solve(1088391168);
solve(1049760000);
solve(1338557220);
}
public static void solve(int n)
{
System.
out.
printf("n=%d → ", n
); if (n <= 1)
{
System.
out.
println("no answer"); return;
}
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[] { n });
for (int factor : prime)
{
if (factor * factor > n) break;
if (n % factor == 0)
{
int size = 0;
double[] temp = new double[64];
final double _d
= Math.
nextUp(1D
/ factor
); double d = _d;
do
{
temp[size++] = d;
d *= _d;
n *= _d;
} while (n % factor == 0);
add
(list,
Arrays.
copyOf(temp, size
)); }
}
if (n > 1) add(list, 1D / n);
int answer = -1;
for (int i = 0; i < list.size(); i++)
{
int[] is = list.get(i);
for (int j = i + 1; j < list.size(); j++)
{
if ((i & j) != 0) continue;
int[] js = list.get(j);
for (int iv : is)
{
for (int jv : js)
{
int diff
= Math.
abs(iv
- jv
); if (diff < min)
{
min = diff;
answer
= Math.
min(iv, jv
); }
}
}
}
}
System.
out.
printf("a=%d, b=%d%n", answer, answer
+ min
); }
static void add(List<int[]> list, double... mul)
{
int limit = list.size();
for (int i = 0; i < limit; i++)
{
int[] src = list.get(i);
int[] dst = new int[src.length * mul.length];
int pos = 0;
for (int j : src)
{
for (double m : mul)
{
dst
[pos
++] = (int) Math.
round(j
* m
); }
}
list.add(dst);
}
}
}
LyoK44OX44Ot44Kw44Op44Of44Oz44Kw44Gu44GK6aGM44K544OsIFBhcnQxMSAKaHR0cHM6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTUyNDU3MDMxNC81MzMKIAo1MzMg5ZCN5YmN77ya44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTW3NhZ2VdIOaKleeov+aXpe+8mjIwMTgvMDYvMjIo6YeRKSAwMDoxMToxMC40OSBJRDozTVAzNVdieQrjgYrpoYzvvJoK44GC44KL5pWw5YCkbuOBjOS4juOBiOOCieOCjOOBn+aZguOBq+OAgeasoeOBruadoeS7tuOCkua6gOOBn+OBme+8kuOBpOOBruaVsOWApGEsYuOCkuaxguOCgeOAgeihqOekuuOBmeOCi+ODl+ODreOCsOODqeODoOOCkuS9nOaIkOOBl+OBquOBleOBhOOAggril49h44GoYuOBruacgOWwj+WFrOWAjeaVsOOBjG7jgajjgarjgosK4pePYTxi44GL44GkYeOBqGLjga7lt64oYi1hKeOBjOacgOWwj+OBqOOBquOCiwogCuS+i++8mm49IDM2MOKGkmE9IDM2LGI9IDQwCuOAgOOAgG49MTAwMOKGkmE9MTI1LGI9MjAwCiAKIArkvovjgYzplpPpgZXjgaPjgabjgZ/jgonjgrTjg6Hjg7MKICovCgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCnB1YmxpYyBjbGFzcyBNYWluCnsKICAgIHN0YXRpYyBpbnRbXSBwcmltZSA9IG5ldyBpbnRbNjU1MzZdOwogICAgc3RhdGljCiAgICB7CiAgICAgICAgYm9vbGVhbltdIGIgPSBuZXcgYm9vbGVhbls2NTUzNl07CiAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCAyNTY7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChiW2ldKSBjb250aW51ZTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKiAyOyBqIDwgYi5sZW5ndGg7IGogKz0gaSkKICAgICAgICAgICAgICAgIGJbal0gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaW50IHNpemUgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgNjU1MzY7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghYltpXSkgcHJpbWVbc2l6ZSsrXSA9IGk7CiAgICAgICAgfQogICAgICAgIHByaW1lID0gQXJyYXlzLmNvcHlPZihwcmltZSwgc2l6ZSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgc29sdmUoMzYwKTsKICAgICAgICBzb2x2ZSgxMDAwKTsKICAgICAgICBzb2x2ZSgxMDg4MzkxMTY4KTsKICAgICAgICBzb2x2ZSgxMDQ5NzYwMDAwKTsKICAgICAgICBzb2x2ZSgxMzM4NTU3MjIwKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbHZlKGludCBuKQogICAgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJuPSVkIOKGkiAiLCBuKTsKICAgICAgICBpZiAobiA8PSAxKQogICAgICAgIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJubyBhbnN3ZXIiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBBcnJheUxpc3Q8aW50W10+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBsaXN0LmFkZChuZXcgaW50W10geyBuIH0pOwoKICAgICAgICBmb3IgKGludCBmYWN0b3IgOiBwcmltZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmYWN0b3IgKiBmYWN0b3IgPiBuKSBicmVhazsKICAgICAgICAgICAgaWYgKG4gJSBmYWN0b3IgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOwogICAgICAgICAgICAgICAgZG91YmxlW10gdGVtcCA9IG5ldyBkb3VibGVbNjRdOwogICAgICAgICAgICAgICAgZmluYWwgZG91YmxlIF9kID0gTWF0aC5uZXh0VXAoMUQgLyBmYWN0b3IpOwogICAgICAgICAgICAgICAgZG91YmxlIGQgPSBfZDsKICAgICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVtcFtzaXplKytdID0gZDsKICAgICAgICAgICAgICAgICAgICBkICo9IF9kOwogICAgICAgICAgICAgICAgICAgIG4gKj0gX2Q7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChuICUgZmFjdG9yID09IDApOwogICAgICAgICAgICAgICAgYWRkKGxpc3QsIEFycmF5cy5jb3B5T2YodGVtcCwgc2l6ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuID4gMSkgYWRkKGxpc3QsIDFEIC8gbik7CiAgICAgICAgCiAgICAgICAgaW50IG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgIGludCBhbnN3ZXIgPSAtMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnRbXSBpcyA9IGxpc3QuZ2V0KGkpOwogICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBsaXN0LnNpemUoKTsgaisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKGkgJiBqKSAhPSAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGludFtdIGpzID0gbGlzdC5nZXQoaik7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpdiA6IGlzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGp2IDoganMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IE1hdGguYWJzKGl2IC0ganYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZGlmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IE1hdGgubWluKGl2LCBqdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoImE9JWQsIGI9JWQlbiIsIGFuc3dlciwgYW5zd2VyICsgbWluKTsKICAgIH0KICAgIAogICAgc3RhdGljIHZvaWQgYWRkKExpc3Q8aW50W10+IGxpc3QsIGRvdWJsZS4uLiBtdWwpCiAgICB7CiAgICAgICAgaW50IGxpbWl0ID0gbGlzdC5zaXplKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50W10gc3JjID0gbGlzdC5nZXQoaSk7CiAgICAgICAgICAgIGludFtdIGRzdCA9IG5ldyBpbnRbc3JjLmxlbmd0aCAqIG11bC5sZW5ndGhdOwogICAgICAgICAgICBpbnQgcG9zID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaiA6IHNyYykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChkb3VibGUgbSA6IG11bCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkc3RbcG9zKytdID0gKGludCkgTWF0aC5yb3VuZChqICogbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdC5hZGQoZHN0KTsKICAgICAgICB9CiAgICB9Cn0K