/*
プログラミングのお題スレ 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;
import java.util.stream.DoubleStream;
public class Main
{
public static void main
(String[] args
) {
solve(360);
solve(1000);
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 = 2; factor * factor <= n; factor++)
{
if (n % factor == 0)
{
DoubleStream.Builder builder = DoubleStream.builder();
final double _d = 1D / factor;
double d = _d;
do
{
builder.accept(d);
d *= _d;
n *= _d;
} while (n % factor == 0);
add(list, builder.build().toArray());
}
}
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);
}
}
}
LyoK44OX44Ot44Kw44Op44Of44Oz44Kw44Gu44GK6aGM44K544OsIFBhcnQxMSAKaHR0cHM6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTUyNDU3MDMxNC81MzMKCjUzMyDlkI3liY3vvJrjg4fjg5Xjgqnjg6vjg4jjga7lkI3nhKHjgZfjgZXjgpNbc2FnZV0g5oqV56i/5pel77yaMjAxOC8wNi8yMijph5EpIDAwOjExOjEwLjQ5IElEOjNNUDM1V2J5CuOBiumhjO+8mgrjgYLjgovmlbDlgKRu44GM5LiO44GI44KJ44KM44Gf5pmC44Gr44CB5qyh44Gu5p2h5Lu244KS5rqA44Gf44GZ77yS44Gk44Gu5pWw5YCkYSxi44KS5rGC44KB44CB6KGo56S644GZ44KL44OX44Ot44Kw44Op44Og44KS5L2c5oiQ44GX44Gq44GV44GE44CCCuKXj2Hjgahi44Gu5pyA5bCP5YWs5YCN5pWw44GMbuOBqOOBquOCiwril49hPGLjgYvjgaRh44GoYuOBruW3rihiLWEp44GM5pyA5bCP44Go44Gq44KLCgrkvovvvJpuPSAzNjDihpJhPSAzNixiPSA0MArjgIDjgIBuPTEwMDDihpJhPTEyNSxiPTIwMAoKCuS+i+OBjOmWk+mBleOBo+OBpuOBn+OCieOCtOODoeODswogKi8KIAppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uRG91YmxlU3RyZWFtOwoKcHVibGljIGNsYXNzIE1haW4KewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICBzb2x2ZSgzNjApOwogICAgICAgIHNvbHZlKDEwMDApOwogICAgICAgIHNvbHZlKDEwNDk3NjAwMDApOwogICAgICAgIHNvbHZlKDEzMzg1NTcyMjApOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29sdmUoaW50IG4pCiAgICB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIm49JWQg4oaSICIsbik7CiAgICAgICAgaWYgKG4gPD0gMSkKICAgICAgICB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm8gYW5zd2VyIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQXJyYXlMaXN0PGludFtdPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgbGlzdC5hZGQobmV3IGludFtdIHsgbiB9KTsKCiAgICAgICAgZm9yIChpbnQgZmFjdG9yID0gMjsgZmFjdG9yICogZmFjdG9yIDw9IG47IGZhY3RvcisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKG4gJSBmYWN0b3IgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRG91YmxlU3RyZWFtLkJ1aWxkZXIgYnVpbGRlciA9IERvdWJsZVN0cmVhbS5idWlsZGVyKCk7CiAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgX2QgPSAxRCAvIGZhY3RvcjsKICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gX2Q7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWNjZXB0KGQpOwogICAgICAgICAgICAgICAgICAgIGQgKj0gX2Q7CiAgICAgICAgICAgICAgICAgICAgbiAqPSBfZDsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKG4gJSBmYWN0b3IgPT0gMCk7CiAgICAgICAgICAgICAgICBhZGQobGlzdCwgYnVpbGRlci5idWlsZCgpLnRvQXJyYXkoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG4gPiAxKSBhZGQobGlzdCwgMUQgLyBuKTsKICAgICAgICAKICAgICAgICBpbnQgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgaW50IGFuc3dlciA9IC0xOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGludFtdIGlzID0gbGlzdC5nZXQoaSk7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgoaSAmIGopICE9IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaW50W10ganMgPSBsaXN0LmdldChqKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGl2IDogaXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQganYgOiBqcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gTWF0aC5hYnMoaXYgLSBqdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgbWluKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gTWF0aC5taW4oaXYsIGp2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoImE9JWQsIGI9JWQlbiIsIGFuc3dlciwgYW5zd2VyICsgbWluKTsKICAgIH0KICAgIAogICAgCiAgICBzdGF0aWMgdm9pZCBhZGQoTGlzdDxpbnRbXT4gbGlzdCwgZG91YmxlLi4uIG11bCkKICAgIHsKICAgICAgICBpbnQgbGltaXQgPSBsaXN0LnNpemUoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbWl0OyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnRbXSBzcmMgPSBsaXN0LmdldChpKTsKICAgICAgICAgICAgaW50W10gZHN0ID0gbmV3IGludFtzcmMubGVuZ3RoICogbXVsLmxlbmd0aF07CiAgICAgICAgICAgIGludCBwb3MgPSAwOwogICAgICAgICAgICBmb3IgKGludCBqIDogc3JjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKGRvdWJsZSBtIDogbXVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRzdFtwb3MrK10gPSAoaW50KSBNYXRoLnJvdW5kKGogKiBtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBBcnJheXMuc29ydChkc3QpOwogICAgICAgICAgICBsaXN0LmFkZChkc3QpOwogICAgICAgIH0KICAgIH0KfQo=