中易网

判断 是否为素数 公式

答案:1  悬赏:40  
解决时间 2021-04-28 03:16
  • 提问者网友:北故人
  • 2021-04-27 10:06
C语言中 用户随意输入一个数 只用一个公式就可以 判断是不是素数 谢谢大家!
最佳答案
  • 二级知识专家网友:心与口不同
  • 2021-04-27 11:14
以下的程序在borland c++ complier 5.5下通过,
但在visual c++ 6.0下无法通过,原因是不支持string类的操作
各位可以自己改一改

效果:
PⅢ850
128M ram内存
算到1亿用时:48S
算到10亿用时:580S
算到100亿估计用时:6000S
这仍然太慢,需要改进。

要想算到100亿,unsigned int(max=42亿)
是不行的,需要改进记数格式。

不管程序本身怎么样,这毕竟是我写的第一个c++程序。
让各位见笑了

大家可以用c自己写一个,效果比这个要好。

本来好好的缩进格式,被tencent的傻cgi一过滤,就面目全非了。
大家如果想看好的缩进格式的程序和图表,可以给我留言,把你的邮箱地址给我。
或直接点"回复"->"引用"->"全部"

然后把文字输入框里的文本粘贴到写字板(不是记事本)里,把">"全部替换掉
就可以了
//begin of Primedat.h
#include<iostream.h>
#include<stdlib.h>
class Primedat
{
public:
int onedat; // one of the data
Primedat(int maxprime);
~Primedat();
void initdat(void); //设置指针位置
void marknonprime(void); //标记当前指针所指数据为非素数
void showprime(void); //显示当前指针所指数据
private:
int arrsize; //win98 一个内存页4kB
unsigned short **data; //指针数组,记录各数据数组的首地址
int arrnumlimit; //一个数组所能标记的素数上限
int datID; //内存块索引
int arrID; //数组中数据索引
int bitblockID; //数据内位块索引
int bitID; //位块内的位索引
int pointercunt; //实际申请到的指针数组长度 释放内存标记
int datacunt; //实际申请到的数组个数释放内存标记
short scrwd; //输出数据占屏幕宽度
unsigned short andortable[16];//标记各个数据位的数据表
unsigned short tmp; //取出的数据缓存
short allocerr; //内存分配错误次数
} ; //原来的时候,这里少了个';'所以出错
//end of Primedat.h

//Begin of Primedat.cpp
#include"Primedat.h"
#include<iostream.h>
Primedat::Primedat(int maxprime)
{
allocerr=0;
arrsize=4096; //win98一个内存页4kb,减少内存碎片
arrnumlimit=arrsize*40;
int i=0;
for(i=0;i<16;i++)
{
andortable[i]=1<<i;//此数据表用来屏蔽某些位或将某些位置1
}
int k=0;
int arrnum;
arrnum=maxprime/arrnumlimit+( ((maxprime%arrnumlimit)==0) ? 0 : 1);
cout<<"arrnum: "<<arrnum<<endl;
data=new unsigned short *[arrnum];//建立一个指针数组
if(data==NULL)
{
cout<<"存放指针的模块内存分配错误,程序不能完成指定的操作,任务被放弃"<<endl;
exit(1);
}
pointercunt=arrnum;
getmem:
try
{
for(;datacunt<arrnum;datacunt++)
{
*(data+datacunt)=new unsigned short[arrsize];
if( (*(data+datacunt)) == NULL)
{
throw datacunt;
}
}
}
catch(int datacunt) // 处理内存分配错误
{
allocerr++;
if(allocerr<3)
{
cout<<"在分配第"<<datacunt+1<<"块内存时失败,系统正在尝试重新分配"<<endl;
goto getmem;
}
else
{
cout<<"内存分配错误已达4次,可能操作系统内存不足。"<<endl
<<"程序不能完成指定的操作,任务被迫放弃"<<endl;
exit(1);
}
}
for(i=0;i<pointercunt;i++)
for(k=0;k<arrsize;k++)
{
*( *(data+i)+k )=0; //初始化数据块
}
cout<<"^_^ 内存初始化完成,primedat类的对象构造成功"<<endl;
}

Primedat::~Primedat() //释放内存
{
for(int i=0;i<pointercunt;i++)
{
delete []( *(data+i) );
}
delete []data;
}//finished

void Primedat::initdat(void)
{
datID=onedat/arrnumlimit;
arrID=(onedat%arrnumlimit)/40;
bitblockID=(onedat%40)/10;
switch(onedat%10)
{
case 1:bitID=0;
break;
case 3:bitID=1;
break;
case 7:bitID=2;
break;
case 9:bitID=3;
break;
default:
cout<<"函数异常调用:"<<endl
<<"Prmiedat::initdat(void)"<<endl
<<"参数非法,int onedat="<<onedat<<"程序被迫中止"<<endl;
exit(1);//非法调用时退出
}
tmp=*(*(data+datID)+arrID);
} //end of function

void Primedat::marknonprime(void)
{
*( *(data+datID) +arrID) |= andortable[bitblockID*4+bitID];//将一个非素数所在的位置1
}//end of function

void Primedat::showprime(void)
{ unsigned short bitsig[4]={1,3,7,9};
if( (tmp&andortable[bitblockID*4+bitID]) ==0)
{
cout<<onedat<<" ";//输出一个素数
scrwd++;
if(scrwd==8)
{
scrwd=0;
cout<<endl;//达到8个数后换行
}
}
}//end of function

//end of Primedat.cpp
#include<math.h>
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include"Primedat.cpp"
#include<time.h>
int main(void)
{
string cmd; //用户输入的命令
const int goal=100000000; //计算目标1亿
int basecunt=3; //外层计数器
int baseflag=3; //外层加标志
int numcunt; //内层计数器
int numflag; //内层加标志
clock_t start ,end; //计算开始和终止时间
start=clock(); //开始计时
Primedat *tenb;
tenb =new Primedat(goal);
const int basegoal=(int)sqrt(goal); //只需计算到goal^(1/2)
int multmp; //中间乘结果
while(basecunt<basegoal) //开始
{
numcunt=basecunt;
numflag=baseflag;
while( (multmp=basecunt*numcunt) <goal)
{
tenb->onedat=multmp;
tenb->initdat();
tenb->marknonprime();
numflag++;
if(numflag==4)//1,3,7,9
{
numcunt+=4;
numflag=0;
}
else
{
numcunt+=2;
}
}
baseflag++;
if(baseflag==4)
{
basecunt+=4;
baseflag=0;
}
else
{
basecunt+=2;
}
}

end=clock();
cout<<"time: "<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
//生成数据完毕

cout<<"由于生成数据过多,逐一显示将耗费大量时间,"<<endl
<<"输入\"show\"显示,其它任意字符退出"<<endl;
cin>>cmd;
if(cmd=="show")
{
baseflag=0;
for(basecunt=7;basecunt<goal;)
{
tenb->onedat=basecunt;
tenb-> initdat();
tenb->showprime();
baseflag++;
if(baseflag==4)
{
basecunt+=4;
baseflag=0;
}
else
{
basecunt+=2;
}
}

}
delete tenb;
return 0;
}//end of main

链接里是全部详细编程思路与过程
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息