C程序找到一个素数

时间:2018-05-27 05:46:51

标签: c function for-loop primes

我写了一个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");
    }
}

4 个答案:

答案 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")