首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求离正整数n最近的质数,该怎么处理

2012-02-27 
求离正整数n最近的质数#include stdio.h#include stdlib.h#include conio.h#include math.hvoidma

求离正整数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 之中是否有数据整除的时候,
这个 商就已经被判断出来了)
[解决办法]
楼主自己尝试写个判断素数的函数就知道了

热点排行