如何有效计算零填充六位数字,其中前三位数等于最后三位?
我的解决方案是这样的。但这不是有效的解决方案。我必须找到最好的方法
public class TicketNumber {
public static void main(String[] args) {
int i1, i2, i3, i4, i5, i6, count = 0;
String str="";
for (i1 = 0; i1 <= 9; i1++) {
for (i2 = 0; i2 <= 9; i2++) {
for (i3 = 0; i3 <= 9; i3++) {
for (i4 = 0; i4 <= 9; i4++) {
for (i5 = 0; i5 <= 9; i5++) {
for (i6 = 0; i6 <= 9; i6++) {
if ((i1+i2+i3) == (i4+i5+i6)) {
count++;
}
}
}
}
}
}
}
System.out.println(count);
}
}
我应打印000000-999999之间的所有数字,与i1 + i2 + i3 = i4 + i5 + i6条件兼容
答案 0 :(得分:3)
计算前三位数等于最后三位数的所有值。 (正如解决方案所示)
你可以计算i4,i5的范围和值i6,这样可以更快。
int count = 0;
for (int i1 = 0; i1 <= 9; i1++) {
for (int i2 = 0; i2 <= 9; i2++) {
for (int i3 = 0; i3 <= 9; i3++) {
int sum = i1 + i2 + i3;
for (int i4 = Math.max(0, sum - 18); i4 <= Math.min(9, sum); i4++) {
int min5 = Math.max(0, sum - i4 - 9);
int max5 = Math.min(9, sum - i4);
if (min5 <= max5) // one solution for i6 each
count += max5 - min5 + 1;
}
}
}
}
System.out.println(count);
打印出与您的解决方案相同的答案;
55252
这是一个进一步的优化,它认识到前三位的顺序并不重要。
int count = 0;
for (int i1 = 0; i1 <= 9; i1++) {
for (int i2 = 0; i2 <= i1; i2++) {
for (int i3 = 0; i3 <= i2; i3++) {
int different = ((i1 != i2)?1:0) + ((i1 != i3)?1:0) + ((i2 != i3)?1:0);
int combinations = different == 0 ? 1 : different == 2 ? 3 : 6;
int sum = i1 + i2 + i3;
for (int i4 = Math.max(0, sum - 18); i4 <= Math.min(9, sum); i4++) {
int min5 = Math.max(0, sum - i4 - 9);
int max5 = Math.min(9, sum - i4);
if (min5 <= max5) // one solution each
count += combinations * (max5 - min5 + 1);
}
}
}
}
System.out.println(count);
这样做可以说123或132或213或231或312或321具有相同数量的解决方案。 111的因子为1,112的因子为3,123的因子为6。