以下程序确定主要变量。对于d大于1且小于p的所有值,返回余数(p%d)的值将isPrime的值设置为" 1"。
- (int)someMethod
{
@autoreleasepool {
int isPrime;
for (int p = 2; p <= 50; ++p) {
isPrime = 1;
for (int d = 2; d < p; ++d) {
if ( p % d == 0)
isPrime = 0;
if ( isPrime != 0)
NSLog (@"%i ", p);
}
}
}
return 0;
}
我的问题是,为什么第一个&#34; for&#34;声明在递增后立即进行,并且#34; 1&#34;而在第二个&#34; for&#34;声明,循环继续进行直到d的值不再小于p,然后才转到最终的&#34;如果&#34;声明和NSLog。
如果这个问题不明确,例如,如果p的值为14,则程序按如下方式进行:
答案 0 :(得分:2)
他了解 for 循环。似乎其他答案无法理解这个问题。该循环根本不能正确地确定素数。例如,当它们不是时,它打印出15个以及49个作为素数。因为它在内循环中进行打印,所以它还会多次打印出素数。它应该打印出15,你的逻辑是合理的。我不知道为什么它不适合你,但它适合我。正确的实施应该是:
- (int)someMethod {
int isPrime;
for (int p = 2; p <= 50; ++p) {
isPrime = 1;
for (int d = 2; d < p; ++d) {
if ( p % d == 0)
isPrime = 0;
}
if (isPrime)
NSLog (@"%i ", p);
}
return 0;
}
我会解释为什么它不起作用。
要确定数字是否为素数,此程序应查看是否有任何数字均分为p
。一旦找到一个,该数字就不再是素数,并且应该将isPrime
设置为0
。一旦检查了每个小于p
的数字,并确定isPrime
,它应该检查isPrime
以查看是否应该打印出该数字。但是,它会在每次检查isPrime
时检查一个数字是否均匀分配到p
。由于isPrime
在开始时为p
的每个值设置为1,因此任何不能被2整除的数字都会打印出来。它会检查2是否均匀分割,但不会立即检查isPrime
是否为1,然后立即将其打印出来,就好像它是素数一样;但如果AFTER 2后面的数字均匀分配到那个数字怎么办?这就是15和49在复合时打印为素数的原因。
答案 1 :(得分:0)
我不明白你不清楚的事。
问题:查找p
是否为素数。
p
如果没有任何因素d <= p
,则p%d == 0
为1
,p
和p
本身除外。内部for必须遍历所有小于p
的数字,以确保它们中的任何一个都不是if ( p % d == 0)
{
isPrime = 0;
NSLog("number is not prime!);
break;
}
的因子。
请注意,这个实现是微不足道的,并且效率很低,它实现了素数的隐含定义。
唯一可能让您感到困惑的事情是,当找到一个因子时,内环不会被中断,例如
{{1}}
答案 2 :(得分:0)
“我的问题是,为什么第一个”for“语句在递增”1“后立即进行,而在第二个”for“语句中,循环继续进行,直到d的值不再小于p到最后的“if”语句和NSLog。“
看起来你对for循环的工作方式感到困惑。
// Outer loop will run 1 time
for (int i = 0; i < 1; i++) {
NSLog(@"Outer loop = %d", i);
// Innter loop will run 10 times
for (int j = 0; j < 10; j++) {
NSLog(@"Inner loop = %d", j);
}
}
上面的循环打印出以下输出:
Outer loop = 0
Inner loop = 0
Inner loop = 1
Inner loop = 2
Inner loop = 3
Inner loop = 4
Inner loop = 5
Inner loop = 6
Inner loop = 7
Inner loop = 8
Inner loop = 9
编辑:
- (int)isPrime
{
@autoreleasepool {
// Outer loop will run once to check if 15 is prime
for (int p = 15; p <= 15; ++p) {
// You set isPrime to 1
int isPrime = 1;
// Inner loop will start at 2 and run until 14, there is no
// need to check if 15 % 1 or 15 % 15 because a prime number is
// divisible by itself or 1
for (int d = 2; d < p; ++d) {
NSLog(@"%d mod %d", p, d);
// The first run through of the inner loop, you check if
// 15 % 2, this is not true, so you skip to the next loop.
if (p % d == 0) {
isPrime = 0;
//break; // This is optional because at this point, you know p is not prime
}
// Remember you set isPrime to 1, so the loop checks if isPrime != 0
// This statement is true, so you print p which at this point is 15.
if (isPrime != 0) {
NSLog (@"%i ", p);
}
// On the next run through of the inner loop, 15 % 3 is equal to
// 0, so you set isPrime to 0, and for the rest of the inner loop
// isPrime is equal to 0, it can not change, this is why p is never
// printed out again
}
}
}
return 0;
}
我在内部循环中添加了一个日志语句。继续运行我的代码,这样你就可以看到发生了什么。我会这样说,你的代码似乎很好。如果isPrime等于0,你知道p是素数,所以添加break语句是个好主意。检查代码以查看放置它的位置。