无法理解算法的答案

时间:2014-07-12 13:54:22

标签: algorithm

我今天在做这个问题。

基本上,问题要求最大的体面'有N个数字的数字,其中' Decent'号码是:

  1. 只有3位和5位数字。
  2. 3出现的次数可被5整除。
  3. 出现5次的次数可以被3整除。
  4. 输入格式

      

    第一行将包含一个整数T,即测试用例的数量,   接着是T行,每行包含整数N,即数字   数字中的数字

    输出格式

      

    最大的有N个数字的体面数字。如果不存在这样的号码,请告诉   Sherlock说他错了并打印' -1'

    示例输入

    4
    1
    3
    5
    11
    

    示例输出

    -1
    555
    33333
    55555533333
    

    解释

      

    对于N = 1,没有这样的数字。对于N = 3,只能使用555   数。对于N = 5,333333仅是可能的数字。对于N = 11,55553333333   并且所有数字排列都是有效数字,其中包括   给定的数字是最大的。

    我用常规方法解决了这个问题,但看到了这个答案:

    t = int(raw_input())
    
    for _ in range(t):
        n = int(raw_input())
        c3 = 5*(2*n%3)
        if c3 > n:
            print -1
        else:
            print '5' * (n-c3) + '3'*c3
    

    有人能解释一下这个方法吗?特别是行' c3 = 5 *(2 * n%3)',谢谢

1 个答案:

答案 0 :(得分:3)

我们正在寻找n = 5 * x + 3 * y的整数解,其中5 * x是3的数,3 * y是5的数。 x和y都必须> = 0且x应该尽可能小,因为如果我们有更多的5,我们可以建立更大的数字。

转换它给出y =(n-5 * x)/ 3。为了使y成为整数n-5 * x必须是3的倍数,所以我们可以计算模3(从现在开始,我写= = for for congruent modulo 3)。

n-5 * x == 0

n == 5 * x == 2 * x(因为5 == 2)

将两边乘以2给出

2 * n == 4 * x == x(因为4 == 1)

由于我们想要x小,我们取x = 2 * n%3和y =(n-5 * x)/ 3

如果y <&lt; 0