我的Swift代码与Java代码。Swift给出了一个错误,但是Java没有';T有什么不同吗?
所以我在写一个应用程序,可以找到一个数的主要因子。我正在用Swift编写应用程序,但如果我将“num”设置为偶数而不是奇数,则会出现错误。错误显示,我的Swift代码与Java代码。Swift给出了一个错误,但是Java没有';T有什么不同吗?,java,swift,for-loop,Java,Swift,For Loop,所以我在写一个应用程序,可以找到一个数的主要因子。我正在用Swift编写应用程序,但如果我将“num”设置为偶数而不是奇数,则会出现错误。错误显示,执行被中断,原因:第5行代码上的EXC_BAD_指令代码=EXC_l386_INVOP,子代码=0x0 以下是Swift代码: var num = 16 for i in 2...(num/2)-1 { if ((num % i) == 0) { var isPrimeFactor = true for
执行被中断,原因:第5行代码上的EXC_BAD_指令代码=EXC_l386_INVOP,子代码=0x0
以下是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
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);
}
}
}
以下是Java代码(我认为它是Swift代码的精确副本):
int num=16;
对于(int i=2;i您永远不应该比较布尔类型是否为==true。如果(isPrimeFactor==true)是冗余的
if isPrimeFactor { ... } else {...}
您可以创建一个只读计算属性,以返回一个Bool值,指示一个数字是否为素数,如下所示:
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
}
如果布尔类型为==true,则不应进行比较。如果(isPrimeActor==true)是冗余的,则不应进行比较
if isPrimeFactor { ... } else {...}
您可以创建一个只读计算属性,以返回一个Bool值,指示一个数字是否为素数,如下所示:
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
}
不,苹果并没有摆脱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)
,或者删除它。不,苹果没有为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..
而不是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)
}
}
OUTER:对于2中的i…(num/2){
如果(数量%i)==0{
对于2中的l..
您应该使用2..
而不是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)
}
}
OUTER:对于2中的i…(num/2){
如果(数量%i)==0{
对于2中的l..
你能解释一下这是什么以及如何使用它吗?哇。这真的很酷!你介意把代码分解一下吗?你不明白哪一部分?这是因为你不需要检查数字本身的平方根以上的数字。这将节省你大量的处理时间。sqrt函数需要一个双精度参数,所以我只需要转换插入整数(self)翻倍。哦,好的。这对我有很大帮助!谢谢!你能解释一下这是什么以及如何使用它吗?哇。那真的很酷!你介意把代码分解一下吗?你不明白哪一部分?这是因为你不需要检查数字本身的平方根以上的数字。这将节省你处理它的大量时间。sqrt函数需要一个Double作为参数,所以我只需将整数(self)转换为Double。哦,好的。这将对我有很大帮助!谢谢!您的问题是,在第一次出现错误的循环中,I-1小于2。因此代码崩溃。(查看我的答案了解更多信息)它看起来更干净,不是吗?还有一件事。当我使用上面的代码时..对不起,我不明白。当使用0..是的,但是这样如果我是2,它仍然会运行。你的问题是,在第一次出现错误的循环中,i-1小于2。因此代码崩溃。(查看我的答案了解更多信息)它看起来更干净,不是吗?还有一件事。当我使用上面的代码时..对不起,我不明白。当使用0..是的,但是这样如果我是2,它仍然会运行。哦,我明白了。所以我应该在那之前做一个if语句,说如果我!=2…没错。但是确保它也不是0。所以我会让它像如果我>=2.我将其添加到我的答案中,另一方面,Java将乐于接受for的(int I=2;I<1;I++)
并执行它0次。如果i>2,不是吗?是的,你是对的。我犯了一个错误。我想如果i-1>=2。所以是的,它应该是i>2。哦,我明白了。所以我应该在那之前做一个if语句,说如果i!=2……没错。但是确保它也不是0。所以我会把它当作如果i>=2。我把它添加到我的答案中,另一方面d、 Java会很高兴地接受(inti=2;i<1;i++)的,并执行它0次。如果i>2,不是吗?是的,你是对的。我犯了一个错误。我想如果i-1>=2。所以是的,它应该是i>2。