【问题标题】:Count numbers where three first digits equal last three计算前三位等于后三位的数字
【发布时间】:2017-07-05 08:22:33
【问题描述】:

如何有效地计算前三位等于后三位的零填充六位数字?

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

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 条件兼容的所有数字

【问题讨论】:

  • 或者等等,你在这里想要做什么有点模棱两可?例如,100000 之后是什么?
  • 试试IntStream.range(0, 999999).forEach(i -&gt; System.out.printf("%06d%n", i));
  • 这是家庭作业吗?
  • 人,这根本不是重复的...... :-/
  • 这令人困惑,您的代码不会像示例中所示的那样计算 000001...

标签: java permutation


【解决方案1】:

计算前三位数字等于后三位数字的所有值。 (正如您的解决方案所建议的那样)

您可以计算 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。

【讨论】:

  • 非常感谢!但是我不懂逻辑。请给个链接来理解这种逻辑吗?
  • @vusala 尝试用铅笔和纸来解决这个问题。并不总是有“链接”可以帮助您。
  • @vusala 您可以计算可能值的范围,而不是尝试每个可能的值。例如如果你有一个 9+9+9 的总和,那么开始 i4 == 0 是没有意义的,因为这不可能有任何匹配。同样,如果 i4+i5 > i1+i2+i3 则在 i6 上循环没有意义。事实上,只有一个或零个可能的 i6 值,因此您也不需要循环这些值。
  • @vusala 我进一步优化了它。这几乎快了 6 倍。
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2021-01-27
  • 2011-02-06
  • 2018-02-06
  • 2023-03-12
  • 2017-01-13
相关资源
最近更新 更多