#include <stdio.h>
#include <stdlib.h>
//线性表
typedef struct Vector {
int* num;//一个数组
int length;//num数组的长度
};
//生成素数表,采用埃拉托色尼筛法
Vector* getPrimeTable(int length) {
int i, j;
int* table = (int*)malloc(sizeof(int) * length + 2);//素数表(下标表示数值,素组元素的内容表示下标是否为素数)
Vector* result = (Vector*)malloc(sizeof(Vector));//素数表(保存最终的结果)
for (i = 0; i <= length; i++)
table[i] = 1;//全部标记为素数
for (i = 2; i <= length; i++) {//整体遍历一遍数组
if (table[i] == 1) {//如果i是素数
for (j = 2; j * i <= length; j++) {//将所有i的倍数都取消素数标记
table[j * i] = 0;//撤销j的素数标记
}
}
}
result->num = (int*)malloc(sizeof(int) * length);//分配内存
result->length = 0;//赋初始值
for (i = 2; i <= length; i++) {//由于table是用数组元素的内容来表示下标对应的数是否为素数,因此需要转化为只保存素数的线性表
if (table[i] == 1) {
result->num[result->length++] = i;
}
}
return result;
}
//根据素数表找出素数,素数表的长度只有10,因此二重for循环的迭代次数大约为10*20=200次
Vector* getPrime(Vector* table, Vector* num) {
Vector* res = (Vector*)malloc(sizeof(Vector));
res->num = (int*)malloc(sizeof(int) * 10);
res->length = 0;
int i, j;
for (i = 0; i < num->length; i++) {
for (j = 0; j < table->length; j++) {
if (num->num[i] % table->num[j] == 0) {//若num中的数能够被table整除,说明该数不是素数
break;//不是素数,跳出循环
}
if (j == table->length - 1) {//如果j循环到了最后一次那么说明num中的数不能被任何table中的数字整除,因此该数一定是素数
res->num[res->length++] = num->num[i];//保存素数到结果集
}
}
}
return res;
}
int main() {
int tblLength = 30;//素数表的长度是30,因为30^2=900
Vector* tbl = getPrimeTable(tblLength);//素数表
Vector* res;//结果
Vector* input = (Vector*)malloc(sizeof(Vector));//600-900所有以7结尾的数
int i;
input->num = (int*)malloc(sizeof(int) * 10);//分配内存
input->length = 0;//设置初始值
for (i = 607; i < 900; i+=10) {
input->num[input->length++] = i;//将所有600-900以7结尾的数存入input
}
res = getPrime(tbl, input);//获取素数表
printf("一共有%d个\n",res->length);//输出结果
for (int i = 0; i < res->length; i++) {
printf("%d\n", res->num[i]);
}
}
如果你是需要算法课的程序,那么我这个程序的时间复杂度还可以。如果你需要C语言课的程序的话,我比较推荐直接穷举。
c语言求解并输出600-900间以7结尾的素数及其个数
for (i = 607; i < 900; i+=10) { input->num[input->length++] = i;\/\/将所有600-900以7结尾的数存入input } res = getPrime(tbl, input);\/\/获取素数表 printf("一共有%d个\\n",res->length);\/\/输出结果 for (int i = 0; i < res->length; i++) { printf("%d\\n", ...
1.求[600,900]之间素数的个数。
{ int total = 0;\/*记录个数*\/ for (int i = 600;i <= 900;i++)\/*从600到900*\/ if (fun(i))total++;printf("共有%d个素数\\n",total);}
求600到900间素数的和
include<math.h> main(){ int m,i,k,n=0;for(m=601;m<=900;m++){ k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)n=n+m;} printf("%d\\n",n);}
C语言题目:键盘随机输入5个数,请从大到小排列输出,并输出其中所有的素数...
include<stdio.h> define N 5 \/\/定义要排序的个数N为5个 main() \/\/主程序开始 { int a[N],i,j,temp; \/\/定义数组a,变量i,j和中间存储变量temp printf("please input %d numbers\\n",N); \/\/输出文本,"请输入N个数字(此处N=5)"for(i=0;i<N;i++) \/\/循环语句,利用...
用c语言随机产生50个100到900之间的整数找出其中的素数并将这些素数按...
i=0;i<n;i++) { printf("%d ",num2[i]); }}main(){ randomx(50,100,900); prime();} 问题原因分析:可能没有将判断出来的素数数值进行保存,起码要定义2个数组分别保存随机产生的出来的50个数据,和其中素数的数据,上面是我给出的代码。运行结果图:...
C语言 找出300以内的所有素数,每行输出6个
如果N是一个大于等于2的整数,并且只有1和N本身是它的因子,没有别的正因子,则称N是一个素数(质数)。#include"stdio.h"main(){ int i,n,num; for(n=0,num=0;n<=300;n++) { i=2; while(i<n&&n%i!=0) i++; if(i==n) { printf("%6d",n); num++; } } printf("n素数个数为%d",...
c语言编程——求100-900间的无暇素数,我写的程序哪里出问题了?求大神指...
首先,是没分清break和continue的区别。这个是只输出两个数的原因。然后,是输出的n不是原来的数,题主对n做了取逆序数,输出的是逆序数。这个是出现大于900的原因。最后,题主本身的对遍历条件n做了操作,导致循环本身也有问题。建议题主,先理清逻辑,重写下。
...100),要求筛选1---‘a’之间所有的素数,并输出的C语言?
1。在 main 函数中,用户输入一个大于 100 的整数,并将其保存在变量 a 中。然后使用一个 for 循环遍历从 2 到 a 的所有整数,对每一个数调用 isPrime 函数进行判断。如果返回值为 1,表示该数是素数,则将其输出。运行程序后,将会输出 1 到 'a'(在用户输入的值范围内)之间的所有素数。
求100到999之间最大三个素数的C语言程序
m<N; m++) { if (isPrime[m]) { cnt++;for (j = m; m*j<N; j++) { isPrime[j*m] = 0;} isPrime[cnt] = m;} } for (i = 0; i <= cnt; i++) { printf("%d\\t\\t", isPrime[i]);} return 0;} 欧几里得算法,这能找出2~N之间多有质数,并按顺序打印出来。
C语言中素数的判断方法
介绍三种使用C语言来判断素数的方法,以及用做素数表来判断找素数的方法。