今天突发奇想,写一个求素数的程序,出现了许多问题,后经反思改进,有些许收获,现分享如下:
首先我一开始写的程序如下:
#include<stdio.h>
void main()
{
int i,j,val;
printf(" Please input a figure:\n");
scanf("%d",&val);
for(i=2;i<val;i++)
{
int n;
for(j=2;j<i;j++)
{
if(i%j==0)
{
break;
}
else
printf("%4d",i);
n++;//此处n++没有起到作用。。。
}
if(n%5==0)
printf("\n");
}
经运行,程序出现错误。错误原因在哪里呢?
首先,取素数的算法出现了错误,当I=2时,它是素数,却因为它可以整除自己,而被去除。那么怎么设计这个算法呢,我的初步思路是,给它一个flag,标志这个数是不是素数,若为素数另flag=1,输出这个数,若不是素数,令flag=0,跳出底层循环,i继续递增。修改后的程序如下:
#include<stdio.h>
int main(void)
{
int i,j,val;
printf("Please input a figure:\n" );
scanf("%d",&val);
for(i=2;i<val;i++)
{
int flag=1; //flag作为标志,表示此数确实是素数
int n;
for(j=2;j<i;j++)
{
if(i%j==0)
flag=0;
break;
}//判断i是否为素数,不是,则跳出本层循环,i继续递增
if(flag==1)//如果I是素数,则将其输出
{
printf("%4d",i);
n++;//记录素数的个数
}
}
if(n%5==0)//每输出五个素数,换行
printf("\n");
}
以上程序能很好的实现如下功能:输入一个数,求小于这个数的全部素数,且以五个数字一行输出;
后又受到函数的思想启发,能不能设计一个代码重用性较高的程序,设计思想如下:
(1)要实现求出素数则要有两个基本功能:首先判断这个数是不是素数,然后将其输出
(2)如此,便设计两个函数分别实现判断和输出的功能。(函数的功能尽可能的单一)
程序如下:
#include<stdio.h>
int is_prime(int val)
{
int i;
for(i=2;i<val;i++)
{
if(val%i==0)
break;
}
if(i==val)
return 1;
else
return 0;
}
int out_put(int val)
{
int i;
for(i=2;i<val;i++)
{
if(is_prime(i))//此处一定是is_prime函数的参数必定是i,因为判断的是i是不是素数,val是其最大值,博主曾在此处犯错,程序运行的结果一直是val的值,后解决。
printf("%4d",i);
}
}
int main(void)
{
int val;
printf("Please input a figure:\n");
scanf('%d",&val);
out_put(val);
return 0;
}