《數據結構與算法分析:C語言描述》習題2.13代碼及自己的想法
2015-08-14 00:18
267 查看
《數據結構與算法分析:C語言描述》習題2.13
大一狗放假在家自學點算法,編程渣,自己練習一下
————————————————————————————————————————(我是劃分線)
题目:編寫一個程序來確定正整數N是否為素數
分析:我採用了一組判別數組,其中下標即為對應是否為N因數的數,元素的值若為true,則說明為判別或者已經判別為N的因數(後者其實可以直接結束函數並返回0,表示N不为素数)
而顯然,因為當k小於等於N的平方根且為N的因數時,必對應另一個因數大於等於N的平方根,所以判別數組的大小只需為sqrt(N)+1 (直接跳過了下標為0的元素,判斷時只遍歷下標1到sqrt(N))。
在循環判別前先對判別數組全部初始化為true(Xcode貌似沒有自帶bool類型,所以在程序開頭用#define語句來定義bool和true,false)。
在判別時,可以注意到,若i不為N的因數,則i的所有整數倍必不為N的因數,所以可以將小於等於sqrt(N)且為i的整數倍的數的對應判別元素的值賦值為false,方便之后对大于i的数字的检查(取整运算应该比判断运算慢吧)
最后,如果程序能执行到最后一个语句(遍历所有循环且未结束),则该数N必為素數,返回1,函數結束。
好了,不多说,上代碼
#include <cstdio> #include <cmath> #define bool int #define true 1 #define false 0 int IsPrime(long long int N); //若为素数,返回1;否则返回0 int main() { long long int n; printf("Enter the N: "); scanf("%lld", &n); printf("%s", IsPrime(n)? "Yes":"No"); return 0; } int IsPrime(long long int N) { long long int k = sqrt(N); bool flag[k+1]; //标志数组,用于找出因数 long long int i; for ( i=0 ; i<=k ; i++) //初始化标志数组元素为true,说明下标为N的因数 flag[i]=true; if ( N == 1 ) return 0; if ( N==2 || N==3 ) return 1; else { long long int j;
if (N%2==0) //判断是否为偶数
return 0; for ( i=3 ; i<=k ; i+=2 ) //只考虑奇数即可 if ( flag[i] == true ) //减少了每个数都要 { if ( N%i!=0 ) for ( j=1 ; j*i<=k ; j++ ) //若i不为N的因数,则i的整数倍也不会是N的因数 flag[j*i] = false; else return 0; } } return 1; //能执行到该语句的必定为素数 }
相关文章推荐
- 百度MP3 API
- [机器学习]k-means算法,非监督机器学习算法
- 黑马学习笔记_集合
- Mac自带截屏软件截图的保存路径更改以及截图的格式更改
- AndroidManifest.xml文件解析
- LINQ之select方法选择多个字段
- Nginx 笔记与总结(12)Nginx URL Rewrite 实例(ecshop)
- QT 布局
- SQL 增删改查(详细)
- Swift爬行篇-- UIButton
- 黑马程序员—-C语言入门十重奏之五相熟
- HDU 5094 --Maze【BFS && 状态压缩】
- js 操作select和option常见用法
- EmguCV+Kinect2.0 实时抠图
- linux内核内存分配(三、虚拟内存管理)
- UNIX环境高级编程之第4章:文件和目录
- qt xml解析
- hdu 5378 概率dp 逆元
- NOJ1007 完美立方(暴力)
- 【C语言经典实例】-直接插入排序