将给定像素长度转换为宽度和高度的程序
Program to convert the given pixels length into width and height
我有一个以像素(图像像素)为单位的输入,例如 24 像素,我的问题是将它们转换为缓冲图像的宽度和高度,对于输入 24,我不能只使用1 高 x 24 宽,它会变得太长,这意味着输出应该像 6 宽 x 4 高,其中有 24 个像素。在 java 中可以这样做吗?我想我正确地解释了我的问题...
Brute-force:从中间开始(在平方根处),然后使用 %
余数运算符从那里尝试直到找到有效的拆分。
static int optimumHeight(int areaSize) {
if (areaSize <= 0)
throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
if (areaSize % h == 0)
return h;
return 1;
}
测试
for (int areaSize = 20; areaSize < 30; areaSize++) {
int height = optimumHeight(areaSize);
int width = areaSize / height;
System.out.printf("%d -> %dWx%dH%n", areaSize, width, height);
}
输出
20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 23Wx1H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 29Wx1H
更新
当areaSize
为素数时,结果总是areaSize x 1H
。评论 (现已删除) 要求更改为使用更大的 areaSize
:
static int optimumHeight(int areaSize) {
if (areaSize <= 0)
throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
if (areaSize <= 2)
return 1;
for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
if (areaSize % h == 0)
return h;
int altSize = areaSize + 1;
for (int h = (int) Math.sqrt(altSize); h > 2; h--)
if (altSize % h == 0)
return h;
return 2;
}
width
计算需要向上取整,所以变成:
int width = (areaSize + height - 1) / height;
例子
1 -> 1Wx1H
2 -> 2Wx1H
3 -> 2Wx2H
4 -> 2Wx2H
5 -> 3Wx2H
6 -> 3Wx2H
7 -> 4Wx2H
8 -> 4Wx2H
9 -> 3Wx3H
10 -> 5Wx2H
11 -> 4Wx3H
12 -> 4Wx3H
13 -> 7Wx2H
14 -> 7Wx2H
15 -> 5Wx3H
16 -> 4Wx4H
17 -> 6Wx3H
18 -> 6Wx3H
19 -> 5Wx4H
20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 6Wx4H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 6Wx5H
我有一个以像素(图像像素)为单位的输入,例如 24 像素,我的问题是将它们转换为缓冲图像的宽度和高度,对于输入 24,我不能只使用1 高 x 24 宽,它会变得太长,这意味着输出应该像 6 宽 x 4 高,其中有 24 个像素。在 java 中可以这样做吗?我想我正确地解释了我的问题...
Brute-force:从中间开始(在平方根处),然后使用 %
余数运算符从那里尝试直到找到有效的拆分。
static int optimumHeight(int areaSize) {
if (areaSize <= 0)
throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
if (areaSize % h == 0)
return h;
return 1;
}
测试
for (int areaSize = 20; areaSize < 30; areaSize++) {
int height = optimumHeight(areaSize);
int width = areaSize / height;
System.out.printf("%d -> %dWx%dH%n", areaSize, width, height);
}
输出
20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 23Wx1H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 29Wx1H
更新
当areaSize
为素数时,结果总是areaSize x 1H
。评论 (现已删除) 要求更改为使用更大的 areaSize
:
static int optimumHeight(int areaSize) {
if (areaSize <= 0)
throw new IllegalArgumentException("areaSize must be positive: " + areaSize);
if (areaSize <= 2)
return 1;
for (int h = (int) Math.sqrt(areaSize); h > 1; h--)
if (areaSize % h == 0)
return h;
int altSize = areaSize + 1;
for (int h = (int) Math.sqrt(altSize); h > 2; h--)
if (altSize % h == 0)
return h;
return 2;
}
width
计算需要向上取整,所以变成:
int width = (areaSize + height - 1) / height;
例子
1 -> 1Wx1H
2 -> 2Wx1H
3 -> 2Wx2H
4 -> 2Wx2H
5 -> 3Wx2H
6 -> 3Wx2H
7 -> 4Wx2H
8 -> 4Wx2H
9 -> 3Wx3H
10 -> 5Wx2H
11 -> 4Wx3H
12 -> 4Wx3H
13 -> 7Wx2H
14 -> 7Wx2H
15 -> 5Wx3H
16 -> 4Wx4H
17 -> 6Wx3H
18 -> 6Wx3H
19 -> 5Wx4H
20 -> 5Wx4H
21 -> 7Wx3H
22 -> 11Wx2H
23 -> 6Wx4H
24 -> 6Wx4H
25 -> 5Wx5H
26 -> 13Wx2H
27 -> 9Wx3H
28 -> 7Wx4H
29 -> 6Wx5H