C语言:素数的判断与输出前n个素数

素数的分布规律一直是数学难题,但是我们可以用计算机的强大算力进行探究。

问题1:判断输出的数是否是一个素数。

最简单的方法,即是看比它小的数是否能够整除它。代码如下:

#include<stdio.h>
int main()
{
	int n, i, condition = 0; //设定初值为0的condition作为判定条件
	printf("请输入一个正整数\n");
	scanf("%d", &n);
	if (n == 1)//排除特殊情况 
	{
		printf("不是素数\n");
		return 0;
	}
	for (i = 2; i<=(n / 2) ; i++)//历遍可能是因子的i 
	{
		if (n % i == 0)
		{
			condition = 1;
			break;
		}
	}
	if (condition == 0)//没有除1与本身外的其他因子 
		printf("是素数\n");
	else
		printf("不是素数\n");
	return 0;
}

输入:13   输出:是素数

输入:14   输出:不是素数

问题2:输出前n个素数。

上述的方法,需要历遍的可能的因子较多。当需要一次进行多个素数的判断时,效率较低。

对此问题我们简化计算,即只需判断比这一正整数小的全部素数是否可以整除它即可,由此构造数组,用已填入数组的数检测新数,是素数即填入数组。代码如下:

#include<stdio.h>
#define MAX_SIZE 1000
int main()
{
	int n,i,j,m,a[MAX_SIZE],flag=1;//n为数组元素个数
	                               //m为新加入的数(素数)
	                               //设定flag为判定条件
	scanf("%d", &n);
	a[0] = 2;   //2一定是第一个素数
	if(n>1)
	for(i=1;i<=n-1;i++)//开始填入第二到第n个数
	{ 
		for (m = 3;; m++)
		{
			for (j = 0; j <= i - 1; j++)
				if (m % a[j] == 0)  //判断m是否会被已填入的素数整除
					flag = 0;
			if (flag == 1)
			{
				a[i] = m;   //得到新的素数m,将其填入
				break;      //记得终止循环
			}
			flag = 1;       //记得将flag归为初值
		}
	}
	for (i = 0; i <= n - 1; i++)
		printf("%d ", a[i]);
	return 0;
}

输入:10
输出: 2 3 5 7 11 13 17 19 23 29

在C语言中,求n个素数之和可以采用埃拉托斯特尼筛法(Sieve of Eratosthenes),这是一种查找一定范围内所有质数的有效算法。以下是简单的步骤和伪代码: 1. 初始化一个数组`isPrime`,长度为n+1,全设置为true,表示从0到n的所有数字都是候选素数。 2. 设置第一个素数为2,因为它是唯一的偶数质数。 3. 遍历数组,对于每个已经标记为素数的数i: a. 将`isPrime[i*2]`设为false,因为所有的偶数除了2之外都不是素数。 b. 如果i乘以当索引小于等于n,将`isPrime[i*j]`设为false,其中j从3开始,每次递增2,因为我们只需要检查能被i整除的奇数因子。 4. 统计并累加素数:遍历数组,将所有`isPrime`值为true的元素加起来,并加上一个素数。 下面是C代码示例: ```c #include <stdio.h> #include <stdbool.h> // 简单版本的Sieve of Eratosthenes void findPrimes(int n, int primes[]) { bool isPrime[n + 1]; for (int i = 0; i <= n; i++) { isPrime[i] = true; } isPrime[0] = isPrime[1] = false; int count = 0; for (int i = 2; i * i <= n; i++) { if (isPrime[i]) { // 标记i的倍数为非素数 for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } count++; if (count == n) { break; } } } int sum = 0; for (int i = 2; i <= n; i++) { if (isPrime[i]) { primes[count++] = i; sum += i; } } printf(" %d 个素数之和为:%d\n", n, sum); } int main() { int n; printf("请输入你要找的素数个数: "); scanf("%d", &n); int primes[n]; findPrimes(n, primes); return 0; } ``` 运行此程序后,输入你想查找的素数个数n,它会输出对应个数的素数以及它们的和。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值