计算三个第一个数字等于最后三个的数字

时间:2017-02-16 09:48:14

标签: java permutation

如何有效计算零填充六位数字,其中前三位数等于最后三位?

我的解决方案是这样的。但这不是有效的解决方案。我必须找到最好的方法

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条件兼容

1 个答案:

答案 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。