Swift可以用来刷PTA吗?

Swift可以用来刷PTA吗?


众所周知,PTA支持的语言中包含了2014年刚刚诞生的swift语言。Swift语言是苹果公司专门为macOS/iOS 开发设计的一门语言,但实际上苹果并没有限制Swift「不能做什么」。那么如果想用swift来刷PTA,究竟要怎么用?和官方指定的C/C++相比,swift的性能表现又如何呢?

一、怎么用?

打开Xcode,Command-Shift-N新建项目,选择macOS->Command Line Tool,点击Next,之后按照引导就好了。
新项目默认的编译器版本是最新的Swift 5,但PTA目前支持的swift编译器版本是4.0.1,所以需要在项目设置里把版本改一下。
设置编译器版本
之后就是正常的编辑、编译、调试了,和正常的C/C++没有区别,具体可以参考Xcode用C/C++刷题的文章。
二、会比C/C++更快吗?
不会。
从PTA甲级题库里找了一道输入比较少又比较耗时间的题,本来是用C++写的,现在相同的逻辑换成Swift来实现。结果如下:

在这里插入图片描述
显然,swift的性能与C/C++相比并没有优势。考虑到目前PAT考试只能用Windows系统,而Swift在Windows上并没有一款能用的IDE,且性能方面也没有优势,因此不推荐使用Swift来刷题。

测试的题目:
PAT甲级1103

代码:


```cpp
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <math.h>
const int maxSize = 400;
int power[21];
int temp[maxSize], result[maxSize];
int resultSum = 0;
int target, length, p;
bool noSolution = true;
int lower;
int arraySum(int *array) {
    int sum = 0;
    for(int i = 0; i < length; i++)
        sum += array[i];
    return sum;
}
void dfs(int cur, int powerSum, int index) {
    if (powerSum < target && index < length) {
        for(int i = cur; i > 0; i--) {
            temp[index] = i;
            dfs(i, powerSum + power[i], index+1);
        }
    } else {
        if (target == powerSum && index == length) {
            int t = arraySum(temp);
            if (resultSum < t) {
                resultSum = t;
                noSolution = false;
                for(int i = 0; i < length; i++)
                    result[i] = temp[i];
            }
        }
        return;
    }
}
int main() {
    std::cin >> target >> length >> p;
    std::fill(power, power + 21, -1);
    for(int i = 0; pow(i, p) <= target; i++)
        power[i] = pow(i, p);
    int upper = 0;
    for(int i = 20; i >= 0; i--)
        if (power[i] != -1) {
            upper = i;
            break;
        }
    dfs(upper, 0, 0);
    if (noSolution) {
        std::cout << "Impossible" << std::endl;
    } else {
        std::cout << target << " =";
        for(int i = 0; i < length; i++) {
            if (i > 0)
                printf(" +");
            printf(" %d^%d", result[i], p);
            
        }
        printf("\n");
    }
    return 0;
}

```swift
import Foundation

let raw = readLine()!.split(separator: " ").map { Int($0) }

let target = raw[0]!
let length = raw[1]!
let p = raw[2]!

var power = Array.init(repeating: -1, count: 21)

var upper = 0;
for i in 1..<21 {
    if power[i] > target {
        break
    }
    power[i] = Int(pow(Double(i), Double(p)))
}

for i in (0..<21).reversed() {
    if (power[i] != -1) {
        upper = i;
        break;
    }
}

var temp = Array.init(repeating: 0, count: length)
var result = Array<Int>()

func arraySum() -> Int {
    var sum = 0
    for num in temp {
        sum += num
    }
    return sum
}

var maxSum = -1

func dfs (_ cur: Int, _ powerSum: Int, _ index: Int) {
    if powerSum < target , index < length {
        for i in (1...cur).reversed() {
            temp[index] = i;
            dfs(i, powerSum + power[i], index + 1)
        }
    } else if target == powerSum , index == length {
        let t = arraySum()
        if t > maxSum {
            maxSum = t
            result = temp
        }
    }
}

dfs(upper, 0, 0)

if result.isEmpty {
    print("Impossible")
} else {
    print("\(target)", terminator: "")
    for i in 0..<length {
        if i == 0 {
            print(" = \(result[i])^\(p)", terminator: "")
        } else {
            print(" + \(result[i])^\(p)", terminator: "")
        }
    }
    print("")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值