高级语言课程设计报告第四次报告: 素数

高级语言课程设计报告

实习题目

第四次报告: 素数

这是一般教科书中的求解素数的算法。

for(i=2; i<=n; i++)

    {  for(j=2; j<=sqrt(i); j++)

         if( j%i==0 ) break;

        }

    如果n很小的话,这种算法不会耗时很多。但是当n很大的时候,想锻炼耐心的同学不妨试一试。在程序设计竞赛中就必须要设计出一种更好的算法要求能在几秒钟甚至一秒钟之内找出n以内的所有素数。于是就有了筛法求素数。其基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数(肯定是素数),然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:

3 5 7 9 11 13 15 17 19 21 23 25 27 29

剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:2 3 5 7 11 13 17 19 23 29

l 完成ACM俱乐部作业:2015cup实习4素数

l 注意:如果数组过大,请把它开设成全局数组。

l 描述你的算法,注释你的程序。

l 注意勿抄袭:全系统自动判定抄袭,一旦抄袭,0分。

一、实习目的:熟悉素数的筛选和简单找出法

二、针对你的每一道题目:

1.算法描述。

100002个素数

 使用素数筛除法将数组中的素数筛出来,大大加快了速度。再一个循环找出目标。

绝对素数:

 用素数筛除法筛出范围内的数组数据,对每一个素数进行颠倒,将每一位赋到另一个小数组上,进行换位,对其进行判定,筛除,最后用输出素数的个数定义一个变量,进行格式的控制。

2.你的代码及注释。

100002个素数:

#include <stdio.h>

#include <math.h>

#define n 1300000

int a[n]; //全局定义数组

int main()

{

int e,b,c,d,f=0;

for(e=2;e<n;e++) //标记

{

a[e]=1;

}

for(b=2;b<sqrt(n);b++) //筛除

{

if(a[b]==1)

for(d=b+b;d<n;d+=b)

a[d]=0;

}

for(c=2;c<n;c++) //寻找100002个素数

{

if(a[c]==1)

f++;

if(f==100002)

{

printf("%d",c); //输出

break;

}

}

return 0;

}

 

 

绝对素数:

#include <stdio.h>

#include <math.h>

#define  N 1000000

void huanwei(int a[],int c);        //将素数颠倒的函数,将绝对素数保留

int a[N]; //全局定义放素数的数组

int main()

{

int m,n,b,c,d,e,f=0;

scanf("%d%d",&m,&n); //输入数据

for(c=0,b=m;b<=n;c++,b++) //排除偶数数据

{

if(b%2!=0)

a[c]=b;

} //此时c代表数组大小

for(d=0;d<=c;d++)

{

if(a[d]==0)

continue; //跳过为0的部分

for(e=3;e<=sqrt(a[d]);e++) //筛选素数

{

if(a[d]%e==0)

{

a[d]=0;

break;

}

}

}

huanwei(a,c); //用函数对数组进行加工

for(d=0;d<=c;d++)

{

if(a[d]==0)

continue;

else

{

if(f%10!=0&&f!=0)  printf(" ");      //输出绝对素数,对格式进行加工

printf("%d",a[d]);

f++;

}

if(f%10==0)

printf("\n");

}

return 0;

}

void huanwei(int a[N],int c) //换位函数

{

int h,g[7]={0},b,d,e,f; //定义g放素数各位数字

for(b=0;b<=c;b++)

{

f=0;

if(a[b]==0)

continue;

for(d=1;a[b]%d!=a[b];d=d*10); //开始进行数字颠倒

d=d/10;

h=d;

for(e=0;d!=0;e++,d=d/10)

g[e]=a[b]/d%10;

e--;

for(;e>=0;e--,h=h/10)

f=f+g[e]*h;

for(e=2;e<=sqrt(f);e++) //判断颠倒后是否为素数

{

if(f%e==0)

{

a[b]=0;

break;

}

}

}

}

 

 

3. 设计及调试过程遇到的问题及解决方案。

第100002个素数:

 开始没有学会那个简单的找素数的算法,费了好大的劲,还以为前途无望了,后来经同学指点学会了这一神技,才顺利编下去,总的来说,学会了新的算法,还不错。注释写错了,被同学发现,还是不够细心。

绝对素数:

 使用神技后发现没有那么简单,因为不知道时间限制的范围在哪,就用较为费时但是省事的方法进行,最后的难点在换位上,我没有用专用的函数,一遍又一遍的调试,最终做好了,还是很麻烦的,最后还是83%的正确率,至今老师也不知道什么情况。时隔三日,终于发现问题,原来是在筛出素数的过程中出错了,很是尴尬,少了一个=就废了这么大的劲,同志还需努力啊。

  1. 心得体会和自我对程序的评价。

    学会了简单的素数算法,没有找不出的错,只有不会找的人,还是太粗心,代码没有太大的问题还是在细节的地方不行,细节决定成败啊 ,细节决定成败!!!

posted @ 2017-02-20 20:05  拓海藤原  阅读(347)  评论(0编辑  收藏  举报