⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slnum_p.cpp

📁 素数生成算法
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "slnum_p.h"
//---------------------------------------------------------------------------


#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;

long   a,b,c;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---------------从string类中取出字符串转换为char * -------------------------------
char * strtoa(String ss)
{
     char *sa;
     sa=new char[strlen(ss.c_str())+1];
     strcpy(sa,ss.c_str() );
     return sa;
}
/*-----------------------------------------------------------------------
版权所有:贵州省天柱县二中  罗国文,邮编:556600,Email:xuefu998@yahoo.com.cn
本程序提供了一种关于素数判定的新算法,以这些基本函数为基础,可帮助我们
处理关于素数的许多命题。
版权声明:在您使用和推广本程序时尊重作者版权,不准在不经许可的情况下发表
-------------------------------------------------------------------------*/

long Test_1(long x)            //求模2的倍数
{
     long n;
     n=x/2;
     return  n;
}

int Test_2(long x)             //判断x模2的余数,返回值{0,1}
{
     int k;
     k=x%2;
     return k;
}

int Test_P(long n)        //P素性检验 当(2n+1)为素返回1,否则5返回0
{
    if(n==0)return 0;
    if((n>3)&& (n%3==1))  return 0;
     else   {
            long m,N;
            N=n/2;
            for(m=2;(m*m+m)<=N;m++)
                {
                if (Test_P(m))
                     if(n%(m*2+1)==m) return 0;
                }
            }
    return 1;
}

//数x的素性检验,x为素数返回1,否则为0
int Test_X(long x)
{
   if (x==1) return 0;
   if (x==2) return 1;
   if (Test_2(x)==0) return 0;
   long n;
   n=Test_1(x);
   return (Test_P(n));
}
//----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long x,A,B; int i=0;
  Form1->Label7->Caption ="";
  A=a;B=b;
  char *s,*ss;
  s=new char[65536];
  ss=new char[65536];
  Form1->RichEdit1->Lines->Clear();
//  if (A<=2) { Form1->RichEdit1->Lines->Append('2'),i=1;}
  for(x=A;x<=B;x=x+1)
          if(Test_X(x)==1)
                {++i;
                ltoa(x,s,10);
                Form1->RichEdit1->Lines->Append(s); }
  strcpy(ss,"计算完成,这个范围内的素数有:");
  ltoa(i,s,10);
  strcat(ss,s);
  strcat(ss,"个");
  Form1->Label7->Caption =ss;
  delete s;
  delete ss;
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Edit2Exit(TObject *Sender)
{
      b=atol(strtoa(Form1->Edit2->Text));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
      a=atol(strtoa(Form1->Edit1->Text));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
  long x,A,B; int i=0;
  A=a;B=b;
  Form1->Label7->Caption ="";
  char *s,*ss;
  s=new char[65536];
  ss=new char[65536];
  Form1->RichEdit1->Lines->Clear();
  for(x=A;x<=B;x=x+1)
          if(Test_P(x)==1)
                {++i;
                ltoa(x,s,10);
                Form1->RichEdit1->Lines->Append(s );}
  strcpy(ss,"计算完成,这个范围内的Q数有:");
  ltoa(i,s,10);
  strcat(ss,s);
  strcat(ss,"个");
  Form1->Label7->Caption =ss;
  delete s;
  delete ss;
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Edit3Exit(TObject *Sender)
{
      a=atol(strtoa(Form1->Edit3->Text));        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit4Exit(TObject *Sender)
{
      b=atol(strtoa(Form1->Edit4->Text));        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit5Exit(TObject *Sender)
{
      a=atol(strtoa(Form1->Edit5->Text));        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit6Exit(TObject *Sender)
{
      b=atol(strtoa(Form1->Edit6->Text));
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Button3Click(TObject *Sender)
{
  long x,A,B,i=0;
  char *s,*ss;
  Form1->Label8->Caption ="";
  s=new char[65536];
  ss=new char[65536];
  A=Test_1(a);B=Test_1(b)-1;
  Form1->RichEdit2->Lines->Clear();
  for(x=A;x<=B;x=x+1)
          if(Test_P(x)*Test_P(x+1))
                {++i;
                ltoa(2*x+1,s,10);
                strcpy(ss,s);
                strcat(ss,"------>");
                ltoa(2*x+3,s,10);
                strcat(ss,s);
                Form1->RichEdit2->Lines->Append(ss );}
  strcpy(ss,"这个范围内的孪生素数对有数有:");
  ltoa(i,s,10);
  strcat(ss,s);
  strcat(ss,"对");
  Form1->Label8->Caption =ss;
  delete s;
  delete ss;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
  Form1->RichEdit3->Lines->Clear();
  int k,flag;
  long A,i,x,r,B;
  A=a;B=b;
  Form1->Label9->Caption ="";
  char *s,*ss;
  s=new char[65536];
  ss=new char[65536];
  for (i=A-1;i<B;i++)
  {
    k=Test_2(i);
    x=Test_1(i) ;
    r=0; flag=1;
     while  (flag)
          {
          if (r>x){ Form1->RichEdit3->Lines->Append("找不到这个偶数的1+1解");return;}
          if(Test_P(x-r)*Test_P(x+r+k))
            {   ltoa(2*(x-r)+1,s,10);
                strcpy(ss,s);
                strcat(ss,"+");
                ltoa(2*(x+r+k)+1,s,10);
                strcat(ss,s);
                strcat(ss,"=");
                ltoa(2*i+2,s,10);
                strcat(ss,s);
                Form1->RichEdit3->Lines->Append(ss );
                flag=0;
            }
            r++;
          }
   }
  Form1->Label9->Caption ="计算已经完成,请查看数据……";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Form1->RichEdit3->Lines->Clear();
  Form1->Label9->Caption ="";
  int k;
  long i,j=0,x,r;
  char *s,*ss;
  s=new char[65536];
  ss=new char[65536];
  i=a-1;
    k=Test_2(i);
    x=Test_1(i) ;
    r=0;
     while  (r<x)
          {
          if (r>x){ Form1->RichEdit3->Lines->Append("找不到这个偶数的1+1解");return;}
          if(Test_P(x-r)*Test_P(x+r+k))
            {   j++;
                ltoa(2*(x-r)+1,s,10);
                strcpy(ss,s);
                strcat(ss,"+");
                ltoa(2*(x+r+k)+1,s,10);
                strcat(ss,s);
                strcat(ss,"=");
                ltoa(2*i+2,s,10);
                strcat(ss,s);
                Form1->RichEdit3->Lines->Append(ss );
            }
            r++;
          }
  strcpy(ss,"这个偶数2a的1+1解有:");
  ltoa(j,s,10);
  strcat(ss,s);
  strcat(ss,"个");
  Form1->Label9->Caption =ss;
  delete s;
  delete ss;
}
//---------------------------------------------------------------------------






void __fastcall TForm1::FormResize(TObject *Sender)
{

    Form1->RichEdit1->Height =Form1->PageControl1->Height-100;
    Form1->RichEdit2->Height =Form1->PageControl1->Height-100;
    Form1->RichEdit3->Height =Form1->PageControl1->Height-100;
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -