我在 Swift 与 Java 中的代码。 Swift 给出错误,但 Java 没有。有什么不同吗?
My code in Swift vs. Java. Swift gives an error but Java doesn't. Are there any differences?
所以我正在编写一个应用程序来查找数字的质因数。我在 Swift 中编写应用程序,但如果我将 "num" 设置为偶数而不是奇数,它会给我一个错误。错误说,Execution was interrupted, reason: EXC_BAD_INSTRUCTION code=EXC_l386_INVOP, subcode=0x0
在代码的第 5 行。
这是 Swift 代码:
var num = 16
for i in 2...(num/2)-1 {
if ((num % i) == 0) {
var isPrimeFactor = true
for l in 2...i-1 {
if ((i%l) == 0) {
isPrimeFactor = false;
}//end if
}//end for
if (isPrimeFactor == true) {
i
}//end if
}//end if
}//end for
这是 Java 代码(我认为是 Swift 代码的精确副本):
int num = 16;
for (int i=2; i<num/2; i++) {
if (num%i == 0) {
boolean isPrimeFactor = true;
for (int l=2; l<i; l++) {
if ((i%l) == 0) {
isPrimeFactor = false;
}
}
if (isPrimeFactor == true) {
System.out.println(i);
}
}
}
此外,Apple 是否去掉了 for 循环中的 ..
?我也使用它们时出错。
编辑:哇。我发现我的代码只需要 ..< 而不是 ...num-1 就可以工作。感谢所有贡献者的帮助!
如果布尔类型 == 真,则永远不要比较。 if (isPrimeFactor == true) 是多余的。
if isPrimeFactor { ... } else {...}
您可以创建一个只读计算 属性 到 return 布尔值,指示数字是否为质数,如下所示:
extension Int {
var isPrime:Bool{
if self < 2 { return false }
let squareRoot = Int(sqrt(Double(self)))
if squareRoot * squareRoot == self { return false }
for i in 2..<Int(ceil(sqrt(Double(self)))) {
if self % i == 0 { return false }
}
return true
}
}
1.isPrime // false
2.isPrime // true
3.isPrime // true
4.isPrime // false
5.isPrime // true
6.isPrime // false
7.isPrime // true
8.isPrime // false
9.isPrime // false
10.isPrime // false
11.isPrime // true
let myInt = 7
if myInt.isPrime {
// do this
} else {
// do that
}
苹果没有去掉..你要写:
for index in 0..<whatever {
}
或
for index in 0...whatever {
}
不,苹果没有摆脱 for in
循环。
你的问题是,那一行:
for l in 2...i-1 {
因为如果i-1
小于2,就会出现这个错误。所以你需要做一个检查,如果i-1等于或大于2。检查这个代码来证明错误:
for l in 2...2 { //No error
for l in 2...1 { //error
所以我会做类似的东西,如果你想保留你的代码:
if(i-1 >= 2){
for a in 2...i-1 {
if ((i%a) == 0) {
isPrimeFactor = false
}//end if
}//end for
}
你这里也有错误:
if (isPrimeFactor == true) {
i
}//end if
您需要将 i 包装成 println(i)
或将其删除。
您应该使用 2 ..< i
而不是 2 ... i - 1
。
2 ..< 2
可以生成空序列,而2 ... 1
会导致错误。
并且您可以像这样简化代码。
OUTER: for i in 2 ... (num / 2) {
if (num % i) == 0 {
for l in 2 ..< i {
if (i % l) == 0 {
continue OUTER
}
}
println(i)
}
}
所以我正在编写一个应用程序来查找数字的质因数。我在 Swift 中编写应用程序,但如果我将 "num" 设置为偶数而不是奇数,它会给我一个错误。错误说,Execution was interrupted, reason: EXC_BAD_INSTRUCTION code=EXC_l386_INVOP, subcode=0x0
在代码的第 5 行。
这是 Swift 代码:
var num = 16
for i in 2...(num/2)-1 {
if ((num % i) == 0) {
var isPrimeFactor = true
for l in 2...i-1 {
if ((i%l) == 0) {
isPrimeFactor = false;
}//end if
}//end for
if (isPrimeFactor == true) {
i
}//end if
}//end if
}//end for
这是 Java 代码(我认为是 Swift 代码的精确副本):
int num = 16;
for (int i=2; i<num/2; i++) {
if (num%i == 0) {
boolean isPrimeFactor = true;
for (int l=2; l<i; l++) {
if ((i%l) == 0) {
isPrimeFactor = false;
}
}
if (isPrimeFactor == true) {
System.out.println(i);
}
}
}
此外,Apple 是否去掉了 for 循环中的 ..
?我也使用它们时出错。
编辑:哇。我发现我的代码只需要 ..< 而不是 ...num-1 就可以工作。感谢所有贡献者的帮助!
如果布尔类型 == 真,则永远不要比较。 if (isPrimeFactor == true) 是多余的。
if isPrimeFactor { ... } else {...}
您可以创建一个只读计算 属性 到 return 布尔值,指示数字是否为质数,如下所示:
extension Int {
var isPrime:Bool{
if self < 2 { return false }
let squareRoot = Int(sqrt(Double(self)))
if squareRoot * squareRoot == self { return false }
for i in 2..<Int(ceil(sqrt(Double(self)))) {
if self % i == 0 { return false }
}
return true
}
}
1.isPrime // false
2.isPrime // true
3.isPrime // true
4.isPrime // false
5.isPrime // true
6.isPrime // false
7.isPrime // true
8.isPrime // false
9.isPrime // false
10.isPrime // false
11.isPrime // true
let myInt = 7
if myInt.isPrime {
// do this
} else {
// do that
}
苹果没有去掉..你要写:
for index in 0..<whatever {
}
或
for index in 0...whatever {
}
不,苹果没有摆脱 for in
循环。
你的问题是,那一行:
for l in 2...i-1 {
因为如果i-1
小于2,就会出现这个错误。所以你需要做一个检查,如果i-1等于或大于2。检查这个代码来证明错误:
for l in 2...2 { //No error
for l in 2...1 { //error
所以我会做类似的东西,如果你想保留你的代码:
if(i-1 >= 2){
for a in 2...i-1 {
if ((i%a) == 0) {
isPrimeFactor = false
}//end if
}//end for
}
你这里也有错误:
if (isPrimeFactor == true) {
i
}//end if
您需要将 i 包装成 println(i)
或将其删除。
您应该使用 2 ..< i
而不是 2 ... i - 1
。
2 ..< 2
可以生成空序列,而2 ... 1
会导致错误。
并且您可以像这样简化代码。
OUTER: for i in 2 ... (num / 2) {
if (num % i) == 0 {
for l in 2 ..< i {
if (i % l) == 0 {
continue OUTER
}
}
println(i)
}
}