求任意范围内回文素数c++解决方案(解决了地址释放的问题,附错误原因简述)
2016-05-07 17:06
246 查看
#include <iostream>
using namespace std;
int Judge(int m)
{
int J_opnum,BOOL=0;
int J_flag=1;
for(J_flag=0,J_opnum=(m/2);J_opnum>1;J_opnum--)
{
if((m%J_opnum)==0) J_flag+=1;
}
if(J_flag<=1)
{
BOOL=1;
}return BOOL;
}
int size(int m)
{
int s_flag,s_opnum;
s_opnum=m/10;
s_flag=1;
for(;s_opnum>0;s_flag++)
{
s_opnum=s_opnum/10;
}
return s_flag;
}
void main()
{
int Room,m_opnum,m_size,SZ,SN,pd,top,lop,judg;
cout<<"请输入搜索回文素数的范围:1~";
cin>>Room;
for(m_opnum=Room;m_opnum>=9;m_opnum--)//认为个位素数不是回文素数
{
if(Judge(m_opnum)==0) continue;
m_size=size(m_opnum);
pd=m_opnum;
int*SeeBit=new int[m_size];
for(SZ=0;SZ<=(m_size);SZ++)
{
SeeBit[SZ]=pd%10;
pd/=10;
}//此时,这个整数的最低位存在0,最高位存在m_size-1
SZ=m_size-1;
for(top=0,lop=SZ,judg=0;top<=(lop-1);top++,lop--)
{
if(SeeBit[top]!=SeeBit[lop])
{
judg=0;
break;
}
judg=1;
}
if(judg==1) cout<<m_opnum<<endl;
/*delete[]SeeBit;SeeBit被delete 后,SeeBit的值不会改变,还是原来的值,但不能再使用SeeBit指向的内存了,程序刚好在这里没有出错,但这时SeeBit指向的这块内存已经不属于程序的内存,如果其它的程序申请内存时也申请到了这块内存,你再对SeeBit的内存进行操作是危险的,因为你在改变其他程序的内存值。因此由于本程序是从大到小申请地址空间,所以每次申请时,因为SeeBit的地址并没有变化,所以只是在重复利用第一次SeeBit所申请的地址,不存在占用系统静态内存的问题。至于输入一亿以上会溢出,是因为超出了编译器系统可以向计算机系统申请的最大内存(windows不会允许vs申请过大的地址)并不是语法错误。对于本程序,在输出后会自动退出,申请的内存会自动消除,所以即使不delete也是安全的*/
}
}
using namespace std;
int Judge(int m)
{
int J_opnum,BOOL=0;
int J_flag=1;
for(J_flag=0,J_opnum=(m/2);J_opnum>1;J_opnum--)
{
if((m%J_opnum)==0) J_flag+=1;
}
if(J_flag<=1)
{
BOOL=1;
}return BOOL;
}
int size(int m)
{
int s_flag,s_opnum;
s_opnum=m/10;
s_flag=1;
for(;s_opnum>0;s_flag++)
{
s_opnum=s_opnum/10;
}
return s_flag;
}
void main()
{
int Room,m_opnum,m_size,SZ,SN,pd,top,lop,judg;
cout<<"请输入搜索回文素数的范围:1~";
cin>>Room;
for(m_opnum=Room;m_opnum>=9;m_opnum--)//认为个位素数不是回文素数
{
if(Judge(m_opnum)==0) continue;
m_size=size(m_opnum);
pd=m_opnum;
int*SeeBit=new int[m_size];
for(SZ=0;SZ<=(m_size);SZ++)
{
SeeBit[SZ]=pd%10;
pd/=10;
}//此时,这个整数的最低位存在0,最高位存在m_size-1
SZ=m_size-1;
for(top=0,lop=SZ,judg=0;top<=(lop-1);top++,lop--)
{
if(SeeBit[top]!=SeeBit[lop])
{
judg=0;
break;
}
judg=1;
}
if(judg==1) cout<<m_opnum<<endl;
/*delete[]SeeBit;SeeBit被delete 后,SeeBit的值不会改变,还是原来的值,但不能再使用SeeBit指向的内存了,程序刚好在这里没有出错,但这时SeeBit指向的这块内存已经不属于程序的内存,如果其它的程序申请内存时也申请到了这块内存,你再对SeeBit的内存进行操作是危险的,因为你在改变其他程序的内存值。因此由于本程序是从大到小申请地址空间,所以每次申请时,因为SeeBit的地址并没有变化,所以只是在重复利用第一次SeeBit所申请的地址,不存在占用系统静态内存的问题。至于输入一亿以上会溢出,是因为超出了编译器系统可以向计算机系统申请的最大内存(windows不会允许vs申请过大的地址)并不是语法错误。对于本程序,在输出后会自动退出,申请的内存会自动消除,所以即使不delete也是安全的*/
}
}
相关文章推荐
- C++实验五——数组的分离。
- c++单例模式 ---超详细
- C++sort
- c++ string使用详解
- C++部分整理
- 用C语言控制台画简单的曲线
- 直观理解C语言中指向一位数组与二维数组的指针
- C++实验5-数组分离
- C++第5次作业
- c++ 中double与string之间的转换,char *
- C语言的变量的内存分配
- C语言一维数组初步学习笔记
- 关于C语言中有string类型吗?
- C++实验5
- sizeof:“我是关键字,不是函数!!!”
- 简单讲解C语言中宏的定义与使用
- More Effective C++----(28)灵巧(smart)指针
- Opencv在安卓平台上编译----调用C++库
- Btree(B-树)---C++
- More Effective C++----(27)要求或禁止在堆中产生对象