题目:判断 101 到 200 之间的素数。
解题思路:首先明确素数的定义,除了1和它本身之外没有其他因数的数即素数。为了得到普适的程序,可以把该问题转换为——输入一个数n,判断其是否为素数。
(一)使用循环直接写程序
①将n作为被除数,将2~n-1各个整数先后作为除数,如果都不能被整除,则n为整数。
解题关键在于检索i与n值的大小,若n不为素数,则在for循环中会直接跳出,所得的i的值必定小于n;若n为素数,则i的值一定是按照正常的2~n逐个检索,要使n%i为0,则i必定大于n。
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<n;i++)
{
if(n%i==0)break; //若n不是素数,取余后得0,直接跳出循环进行下一步检索
}
if(n>i)
printf("%d is not a prime.",n);
else
printf("%d is a prime.",n);
return 0;
}
②为了进一步改进,发现只需要检索到该数的平方根即可。
#include<stdio.h>
#include<math.h> //sqrt函数的头文件
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<sqrt(n);i++) //只需把n换成根号n即可
{
if(n%i==0)break;
}
if(sqrt(n)>i)
printf("%d is not a prime.",n);
else
printf("%d is a prime.",n);
return 0;
}
(二) 采用函数思想
定义一个prime函数(模块化程序设计思路)可写出下列程序:
(判断i与n的关系时,可以先代入一个例子利于找规律。)
#include<stdio.h>
int main()
{
int prime(int n); //函数声明
int n;
scanf("%d",&n);
if(prime(n)) //函数调用
printf("%d is a prime.",n);
else
printf("%d is not a prime.",n);
return 0;
}
int prime(int n) //函数定义
{
int r,i=2;
do
{
r=n%i;
i++;
}while(r!=0);
if(i==n+1) // i>n
return 1;
else
return 0;
}
/*
while(r!=0)
{
r=n%i;
i++;
if(i==n+1)
return 1;
}
return 0;
*/
解题:有了以上基础,要求101到200之间的素数,只需要增加一个外循环对区间内的整数一一进行判定,也就是一个嵌套的for循环。
思路①
#include<stdio.h>
int main()
{
int n,i;
for(n=101;n<201;n++)
{
for(i=2;i<n;i++)
{
if(n%i==0)break;
}
if(n==i)
printf("%d\n",n);
}
return 0;
}
思路②
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,N;
for(N=101;N<201;N++)
{
n=sqrt(N);
for(i=2;i<n;i++)
{
if(N%i==0)break;
}
if(n<=i)
printf("%d\n",N);
}
return 0;
}
结果如下:
101
103
107
109
113
121
127
131
137
139
143
149
151
157
163
167
169
173
179
181
191
193
197
199
Press any key to continue
还是要多看多理解叭#