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("")
}