我写了一个C程序,它告诉给定的数字是否为素数。但它有一个问题。它适用于除5的倍数以外的数字。但它显示5的倍数为素数,如15,25,35,45 ....我无法找到错误。我尝试将其与互联网上的其他程序进行比较,但我无法找到错误。
#include <stdio.h>
int primeornot(int a) {
int i;
for (i = 2; i <= a / 2; i++) {
if (a % i == 0) {
return 0;
break;
} else {
return 1;
}
}
}
main() {
int number_given_by_user;
printf("Enter a positive integer to find whether it is prime or not : ");
scanf("%d", &number_given_by_user);
if (primeornot(number_given_by_user)) {
printf("The given number is a prime number");
} else {
printf("The given number is not a prime number");
}
}
答案 0 :(得分:1)
不仅是5的倍数(例如,9代码也被认为是素数)
您的代码存在缺陷。您正在使用循环,但仅检查第一次迭代,因为您在循环内的条件的每个分支内都有for(i=2;i<=a/2;i++)
{
if(a % i == 0)
{
return 0; // <------- (this one is fine, since finding a divisor means outright that this number isn't a prime)
break; // also, a break after a return is redundant
}
else
{
return 1; // <------- (however, this one is flawed)
}
}
:
return !(input % 2)
在这种形式中,您的代码只执行else
,这不是一个非常好的主要查找算法: - )
您需要做的是检查所有迭代,并且只有当所有迭代都转到int primeornot(int a)
{
int i;
for(i=2;i<=a/2;i++)
{
if(a % i == 0)
{
return 0;
}
else
{
continue;
}
}
return 1; // loop has ended with no divisors --> prime!!
}
分支时,该数字才是素数。
所以,改为:
int primeornot(int a)
{
int i;
for(i=2;i<=a/2;i++)
{
if(a % i == 0)
{
return 0;
}
}
return 1; // loop has ended with no divisors --> prime!!
}
或者,更好的是:
from(props.splitFolderUri)
.to("seda:processSplitFiles");
from("seda:processSplitFiles?concurrentConsumers=10")
.to(log...)
.to(props.remoteFolderUri)
...
答案 1 :(得分:1)
第一次测试后,函数primeornot
立即返回。您不会按照预期对每个除数进行a / 2
测试。
另请注意,测试最多a / 2
的每个数字都是浪费,您可以在i * i > a
时停止。
以下是更正后的版本:
int primeornot(int a) {
int i;
for (i = 2; i * i <= a; i++) {
if (a % i == 0) {
return 0;
}
}
return 1;
}
您可以通过测试2次进一步改进功能,之后只测试奇数:
int primeornot(int a) {
int i;
if (a != 2 && a % 2 == 0)
return 0;
for (i = 3; i * i <= a; i += 2) {
if (a % i == 0) {
return 0;
}
}
return 1;
}
最后,没有参数的main
的原型是int main(void)
,您应该在消息后输出换行符并返回0
:
int main(void) {
int number_given_by_user;
printf("Enter a positive integer to find whether it is prime or not: ");
scanf("%d", &number_given_by_user);
if (primeornot(number_given_by_user)) {
printf("The given number is a prime number\n");
} else {
printf("The given number is not a prime number\n");
}
return 0;
}
答案 2 :(得分:0)
如果它不可分,则返回,因此迭代将仅在for循环中发生一次!因为你回来了!以下代码适合您!
var navController = this.NavigationController;
if(navController == null)
{
return;
}
UINavigationItem navigationItem = navController.TopViewController.NavigationItem;
答案 3 :(得分:-1)
import re
import csv
with open('example1.csv', 'r') as csvFile:
reader = csv.reader(csvFile)
if re.search(r'macet', reader):
for row in reader:
myData = list(row)
print(row)
newFile = open('example2.csv', 'w')
with newFile:
writer = csv.writer(newFile)
writer.writerows(myData)
print("Writing complete")