打印输出 C 的问题
Problems with printing output C
所以我要为学校写代码。我做到了,但我的输出不是他们要求的方式。这段代码给了我两个不同数字之间的素数。所以我必须按行打印这些数字。但是,是的,下面的答案之间有零,您可以明白我的意思。我该如何解决这个问题?
#include <stdio.h>
int is_prime (int number)
{
int is_prime= 1, i;
if (number < 2)
{
is_prime = 0;
}
else
{
for(i = 2; (i * i) <= number; i++)
{
if ((number % i) == 0)
{
is_prime = 0;
break;
}
else
{
is_prime = 1;
}
}
}
return is_prime;
}
int main (void)
{
int lower_limit, upper_limit, i;
scanf("%d\n%d", &lower_limit, &upper_limit);
for(i = lower_limit; i <= upper_limit; i++)
{
if (is_prime (i))
{
printf("\n%d", i);
}
else
{
printf("\n%d", is_prime(i));
}
}
return 0;
}
输出
0
11
0
13
0
0
0
17
0
19
0
参考
11
13
17
19
它在这个 if
块中:
if (is_prime (i))
{
printf("\n%d", i);
}
else
{
printf("\n%d", is_prime(i));
}
这里说的是“如果数字是素数,则打印它,否则打印它是否是素数(此时你已经确定它不是)”。
只需删除 else
块。
如果数字是素数就打印出来。不需要其他 - 更糟糕的是它是不正确的。
您可以简单地使用 is_prime 函数
int is_prime (int number)
{
int is_prime = number > 1, i;
for(i = 2; (i * i) <= number; i++)
{
if ((number % i) == 0)
{
is_prime = 0;
break;
}
}
return is_prime;
}
int main (void)
{
int lower_limit, upper_limit, i;
scanf("%d\n%d", &lower_limit, &upper_limit);
for(i = lower_limit; i <= upper_limit; i++)
{
if (is_prime (i))
{
printf("\n%d", i);
}
}
return 0;
}
另一个问题:溢出。
避免 int
在 i*i
中溢出,这是 未定义的行为 (UB)。
当 number
是 INT_MAX
附近的素数时,就会发生这种情况。
// for(i = 2; (i * i) <= number; i++)
for(i = 2; i <= number/i; i++)
一个好的编译器会看到附近的 number%i
和 number/i
并为它们两个生成高效的代码,因此不会产生昂贵的第二次操作。
当upper_limit == INT_MAX
时下面也会溢出
for(i = lower_limit; i <= upper_limit; i++)
也许
for(i = lower_limit; i - 1 < upper_limit; i++)
只要lower_limit > INT_MIN
.
就可以
所以我要为学校写代码。我做到了,但我的输出不是他们要求的方式。这段代码给了我两个不同数字之间的素数。所以我必须按行打印这些数字。但是,是的,下面的答案之间有零,您可以明白我的意思。我该如何解决这个问题?
#include <stdio.h>
int is_prime (int number)
{
int is_prime= 1, i;
if (number < 2)
{
is_prime = 0;
}
else
{
for(i = 2; (i * i) <= number; i++)
{
if ((number % i) == 0)
{
is_prime = 0;
break;
}
else
{
is_prime = 1;
}
}
}
return is_prime;
}
int main (void)
{
int lower_limit, upper_limit, i;
scanf("%d\n%d", &lower_limit, &upper_limit);
for(i = lower_limit; i <= upper_limit; i++)
{
if (is_prime (i))
{
printf("\n%d", i);
}
else
{
printf("\n%d", is_prime(i));
}
}
return 0;
}
输出
0
11
0
13
0
0
0
17
0
19
0
参考
11
13
17
19
它在这个 if
块中:
if (is_prime (i))
{
printf("\n%d", i);
}
else
{
printf("\n%d", is_prime(i));
}
这里说的是“如果数字是素数,则打印它,否则打印它是否是素数(此时你已经确定它不是)”。
只需删除 else
块。
如果数字是素数就打印出来。不需要其他 - 更糟糕的是它是不正确的。
您可以简单地使用 is_prime 函数
int is_prime (int number)
{
int is_prime = number > 1, i;
for(i = 2; (i * i) <= number; i++)
{
if ((number % i) == 0)
{
is_prime = 0;
break;
}
}
return is_prime;
}
int main (void)
{
int lower_limit, upper_limit, i;
scanf("%d\n%d", &lower_limit, &upper_limit);
for(i = lower_limit; i <= upper_limit; i++)
{
if (is_prime (i))
{
printf("\n%d", i);
}
}
return 0;
}
另一个问题:溢出。
避免 int
在 i*i
中溢出,这是 未定义的行为 (UB)。
当 number
是 INT_MAX
附近的素数时,就会发生这种情况。
// for(i = 2; (i * i) <= number; i++)
for(i = 2; i <= number/i; i++)
一个好的编译器会看到附近的 number%i
和 number/i
并为它们两个生成高效的代码,因此不会产生昂贵的第二次操作。
当upper_limit == INT_MAX
for(i = lower_limit; i <= upper_limit; i++)
也许
for(i = lower_limit; i - 1 < upper_limit; i++)
只要lower_limit > INT_MIN
.