求离正整数n最近的质数
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void main(void)
{
int i,j,m,n,n1,n2;
while(1)
{
clrscr();
scanf( "%d ",&n);
if(n> 1) break;
printf( "You input invalid data. Press any key to input again, please! ");
getch();
}
n1=0;
for(j=n-1;j> 1;j--)
{
m=sqrt(j);
for(i=2;i <m+1;i++)
if(j%i==0) break;
if(i> m) {n1=j; break;}
}
for(j=n+1;;j++)
{
m=sqrt(j);
for(i=2;i <m+1;i++)
if(j%i==0) break;
if(i> m) {n2=j; break;}
}
if(!n1||n-n1!=n2-n)
{
if(!n1) m=n2;
else m=n-n1 <n2-n?n1:n2;
printf( "The nearest prime from %d is %d. ",n,m);
}
else printf( "The nearest prime from %d is %d and %d. ",n,n1,n2);
getch();
}
这是求离正整数n最近的质数的代码,我有好几个地方不明白。
1,for(i=2;i <m+1;i++)
if(j%i==0) break; i为什么=2?为什么不从1开始??
2,m到底是指什么?这段代码大意我是看懂了,但为什么开始要令m=sqrt(j)?
麻烦有耐心的朋友跟我说下这段代码的详细意思吧,嘿嘿,谢谢了!
[解决办法]
1,for(i=2;i <m+1;i++)
if(j%i==0) break; i为什么=2?为什么不从1开始??
从 1 开始的话,
j 为任何整数,
这个 if 都是成立的 ~~~
[解决办法]
m到底是指什么?这段代码大意我是看懂了,但为什么开始要令m=sqrt(j)?
=================================
m 就是一个辅助变量,
用于辅助求取 j 是否为素数的 ~
[解决办法]
判断 j 是否为质数/素数,
就是判断从 2 ~ sqrt(j)+1 之中,
是否存在一个数, 能够被 j 整除,
如果没有, 那么 j 就是 质数/素数。
也有的是计算 2 ~ j/2+1 范围内是否整除的。
(请注意,
如果 j 能被 这个范围以上(sqrt(j)+1 ~ j)的数值整除,
那么整除运算得到的商一定是在 2 ~ sqrt(j)+1 范围以内的,
那么在 判断从 2 ~ sqrt(j)+1 之中是否有数据整除的时候,
这个 商就已经被判断出来了)
[解决办法]
楼主自己尝试写个判断素数的函数就知道了