我的算法思想和实现方式都在代码和注释当中呢,这样的方式确实使算法复杂度降低一个等级,很好啊。
~~~
#include <stdio.h>
#include <time.h>
/**
* 利用数组求前n个质数
* 确定一个数m是否为质数,可以用已求出的质数对m
* 的整除性来确定
*/
//如果不知道质数的特性和想不到优化思路的方法
void getNPrimes_normal();
//优化之后的方法
void getNPrimes_optimize();
int main(void)
{
clock_t start,end;
start = clock(); //开始时,取得开始时间。
//通常的做法的运行时间,输入的n=10000
//getNPrimes_normal();
//优化后的运行时间
getNPrimes_optimize();
end = clock(); //结束时,取得结束时间
printf("Run time: %lf S",(double)(end-start)/CLOCKS_PER_SEC);
return 0;
}
//通常用到的想法
void getNPrimes_normal(){
/**
* 用于保存质数的数量
* @brief count
*/
int count;
printf("Please the count of prime number:\n");
scanf("%d",&count);
//使用数组来保存所求出的质数
int primes[count];
/**
* 首先,第一个已知的质数是2,
* 则计算应该从3开始
*/
primes[0] = 2;
int pc = 1;
int m = 3; //从数字3开始
while(pc < count){
int k = 0;
// 这里只要找不到质数,就会一直在这个循环中
while(k < pc){
if(m % primes[k] == 0){
m += 1;
k = 0;
}else{
k++;
}
}
//找到质数之后,跳出上面的循环
//这个的执行是先执行primes[pc] = m;
//再去执行pc++;
primes[pc++] = m;
m+=1;
}
/**
* 对质数进行输出操作
*
*/
for(pc = 0;pc < count;pc++){
printf("%4d\t",primes[pc]);
}
}
//优化之后的方法
void getNPrimes_optimize(){
/**
* 用于保存质数的数量
* @brief count
*/
int count;
printf("Please the count of prime number:\n");
scanf("%d",&count);
//使用数组来保存所求出的质数
int primes[count];
/**
* 首先,第一个已知的质数是2,
* 则计算应该从3开始
*/
primes[0] = 2;
int pc = 1;
int m =3; //从数字3开始
while(pc < count){
/**
* 首先需要解决的是如何判断一个数是一个质数
* 1:除了数字2之外,其他所有的质数都是奇数
* 2:假设某一个数字是k,只要判断k能否被k之前
* 的质数整除就可以了,如果能够整除,则k就是
* 合数,如果不能整除,k就是质数
*
* 但是,为了减少算法的复杂度,我们这样设想
* p*q=k
* 则肯定p和q中:
* p*p <=k的话,q*q >= k
* 则,只要求k能否被k的平方根之前的数字整除就可以了。
*
* 基于这个思想,我们的实现方式如下:
*/
int k = 0;
// 这里只要找不到质数,就会一直在这个循环中
while(primes[k] * primes[k] <= m){
if(m % primes[k] == 0){
m += 2; //除了数字2之外,其他所有的质数都是奇数
k = 1; //不用使用数字2去测试
}else{
k++;
}
}
//找到质数之后,跳出上面的循环
//这个的执行是先执行primes[pc] = m;
//再去执行pc++;
primes[pc++] = m;
m+=2;
}
/**
* 对质数进行输出操作
*
*/
for(pc = 0;pc < count;pc++){
printf("%4d\t",primes[pc]);
}
}
~~~
下面是我的运行结果,第一个是没有优化的结果,第二个是经过算法优化后的结果,效果还是很明显的。
这个是没有优化的结果:
![这里写图片描述](https://box.kancloud.cn/2016-05-24_5743c074a3439.jpg "")
这个是优化之后的结果:
![这里写图片描述](https://box.kancloud.cn/2016-05-24_5743c074b8e70.jpg "")
- 前言
- 实例一:HelloWorld
- scanf函数学习
- 实数比较
- sizeof()保留字获取类型的大小
- 自增/自减学习
- C学习if条件判断和for循环
- C实现的九九乘法表
- C实现一个比较简单的猜数游戏
- 使用C模拟ATM练习switch..case用法
- 记录一个班级的成绩练习一维数组
- C数组实现矩阵的转置
- C二维数组练习
- 利用数组求前n个质数
- C实现万年历
- C实现数组中元素的排序
- C实现任意进制数的转化
- C判断一个正整数n的d进制数是否是回文数
- C使用递归实现前N个元素的和
- 钢材切割问题
- 使用指针比较整型数据的大小
- 指向数组的指针
- 寻找指定元素
- 寻找相同元素的指针
- 整数转换成罗马数字
- 字符替换
- 从键盘读入实数
- C实现字符行排版
- C实现字符排列
- C实例--判断一个字符串是否是回文数
- 通讯录的输入输出
- 扑克牌的结构定义
- 使用“结构”统计学生成绩
- 报数游戏
- 模拟社会关系
- 统计文件中字符个数
- C实现两个文件的内容输出到同一个屏幕