使用 Swift 4 用非素数向下三角求和

Posted

技术标签:

【中文标题】使用 Swift 4 用非素数向下三角求和【英文标题】:Triangle Sum through down with NON-PRIME numbers with Swift 4 【发布时间】:2018-05-03 12:21:10 【问题描述】:

我知道以前针对不同的编程语言提出过这个问题,我尝试用 Swift 4 来实现这个问题,但是一旦我提交了答案,我就被告知我的答案是错误的,所以这就是任务;

您将从文件中获得一个 TRIANGLE 输入,您需要根据以下给定规则找到数字的最大总和;

    您将从顶部开始向下移动到相邻的数字,如下所示。 您只能沿对角线向下走。 您只能走过非质数。

根据上述规则,下例中从上到下的最大和为24。

var sampleString = """
                    1
                   8  4
                  2  6  9
                 8  5  9  3

如您所见,这有几条路径符合 NOT PRIME NUMBERS 规则; 1>8>6>9, 1>4>6>9, 1>4>9>9 1 + 8 + 6 + 9 = 24。如您所见,1、8、6、9 都不是质数,遍历这些会产生最大和。

赋值字符串:

var assignmentString = """
                         215
                       193 124
                      117 237 442
                    218 935 347 235
                  320 804 522 417 345
                229 601 723 835 133 124
              248 202 277 433 207 263 257
            359 464 504 528 516 716 871 182
          461 441 426 656 863 560 380 171 923
        381 348 573 533 447 632 387 176 975 449
      223 711 445 645 245 543 931 532 937 541 444
    330 131 333 928 377 733 017 778 839 168 197 197
  131 171 522 137 217 224 291 413 528 520 227 229 928
 223 626 034 683 839 53  627 310 713 999 629 817 410 121
924 622 911 233 325 139 721 218 253 223 107 233 230 124 233"""

我的代码:

func maxSumForTriangle(triangleString: String) 
    var temporaryIndex = 0
    var earlierIndex = 0
    var greatSum = 0
    var temporaryMaxInLine = 0
    let values = triangleString.components(separatedBy: .newlines).map 
        $0.components(separatedBy: .whitespaces).compactMap(Int.init)
    
    print(values)
    print(values.count)

    for line in values 
        if line.count == 1 
            greatSum += line[0]
            earlierIndex = line.count - 1
         else 
            for number in line.enumerated() 
                if number.offset == earlierIndex || number.offset == earlierIndex + 1 
                    //Check the number if its prime or not with the isPrime function we defined
                    if !isPrime(number.element) 
                        if number.element > temporaryMaxInLine 
                            temporaryMaxInLine = number.element
                            temporaryIndex = number.offset
                        
                    
                
            
            earlierIndex = temporaryIndex
            greatSum += temporaryMaxInLine
            temporaryMaxInLine = 0
        
    

    print(greatSum)

这导致 7619 但后来我意识到我的问题出在哪里;我不会检查每条可能的路径,我只是检查每一行的最高非素数并继续对其求和。

所以我需要为这个问题找到一种不同的方法,以便我的函数可以检查所有可能的情况并返回最高和

我还想不通,我是否应该实现一个不同的函数,让它再次调用自己,以便它可以检查所有可能的路径?

抱歉,问题很长,但我也想展示我的旧实现。

【问题讨论】:

这更像是一个算法问题,而不是一个关于 Swift 的问题。 –(提示:从最底行开始,然后向上移动。) 是的,这样我就可以遍历所有路径并比较它们的结果。非常感谢! :) 【参考方案1】:

这是一个可以用“dynamic programming”解决的典型问题:这个想法 是计算每个开始的最大可能总和 金字塔中的点。

如果我们从底行开始向上工作,这将变得很简单: 我们只需要将其两个较低邻居中较大的一个添加到每个条目中。 最后,顶部条目是所需的最大总和。

考虑到非素数的附加条件,这 可以实现为

var values = triangleString.components(separatedBy: .newlines).map 
    $0.components(separatedBy: .whitespaces).compactMap(Int.init)


for row in values.indices.reversed() 
    for col in values[row].indices 
        if isPrime(values[row][col]) 
            values[row][col] = Int.min
         else if row + 1 < values.endIndex 
            values[row][col] += max(values[row+1][col], values[row+1][col+1])
        
    


print(values[0][0])

【讨论】:

在您发表评论后,我试图从底部开始实施,但您的解决方案更加清晰和合乎逻辑。非常感谢! 我刚收到一封电子邮件,说函数产生的答案; 8219 也是不正确的。你也打印8219吗?如果是,是否有可能给出作业的人不知道正确答案是什么? @emrepun:8219 不是我得到的。但请注意,我在最后一刻对素数的代码进行了更改。 抱歉,我没听懂。谢谢,现在我更新了,结果现在是 8186 是的,我后来想通了,大概是七千。 @vivek_23

以上是关于使用 Swift 4 用非素数向下三角求和的主要内容,如果未能解决你的问题,请参考以下文章

Python练习题4.2统计素数并求和

C语言中判断N个数中的素数并求和

素数求和问题

nyoj 22-素数求和问题(打表)

梦工场实验室 素数求和 神奇的素数筛选

NYOJ题目22 素数求和