c语言求解并输出600-900间以7结尾的素数及其个数

如题所述

#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语言课的程序的话,我比较推荐直接穷举。

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-04-18

so easy!!

int IsPrime(int n){
int Yes=1,i;
for (i=2;2*i<=n;i++)
if (n % i == 0){
Yes = 0;
break;
}
return Yes;
}

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语言来判断素数的方法,以及用做素数表来判断找素数的方法。

相似回答