一、问题及代码
/*
*文件名:0.cpp
*作者:张前咨
*完成日期:2017年4月10日
*版本号:5.11
*对任务及其完成方法的描述部分:
*输入描述:无
*问题描述:
【项目1:数组素数排序】
*程序输出:
*问题分析:略
*算法设计:略
*/
#include <iostream>
using namespace std;
void sort(int p[], int n); //数组排序
bool prime(int x); //素数判断
void print(int p[],int n);//输出数组
int main( )
{ int a[10]={2,13,5,47,19,53,27,23,28,11};
int b[10],i,j=0;
for(i=0;i<10;i++)
{
if(prime(a[i]))
b[j++]=a[i];//将a中的素数存入b数组
}
print(b,j); //输出排序前的b数组
sort(b,j); //对数组b排序
print(b,j); //输出排序后的b数组
return 0;
}
bool prime(int x)
{
if(x%2)//判断是否为奇数
{
for(int i=3;i*i<=x;i+=2)
{
if(!(x%i))
{
return false;
}
}
return true;
}
else
return false;
}
void sort(int p[],int n)//地精排序
{
int i=0;
int temp;
while(i<n)
{
if(i==0||p[i-1]<=p[i])
i++;
else
{
temp=p[i-1];
p[i-1]=p[i];
p[i]=temp;
i--;
}
}
}
void print(int p[],int n)
{
for(int i=0;i<n;i++)
{
cout<<p[i]<<" ";
}
cout<<endl;
}
二、运行结果
三、心得体会
1、判断素数与排序已经是写过很多遍的问题了,但是想不加思考的直接敲出来,还是有一点难度,还需继续练习。
2、在判断素数时使用了 x%2 的技巧,可以精简代码,但是可读性会比较低。
3、在排序时选用了地精排序,而没有选用更加快速的排序方法,因为这个问题不需要太高的时间复杂度,所以选择地精排序,精剪代码长度。
四、知识点总结
1、判断一个数是否为素数,只需要判定是否能被2整除,及x%2即可,x%2!=0 即为奇数,否则则为偶数。缩写即为x%2。
2、地精排序是冒泡排序的加强版,遇到比前面大的数字则交换位置,回退一步,重新判断,不断重复这个操作,直到排序完毕。