小算法笔记

素数: 除 1 外只能被 1 和自身整除的数。

方法一:

#include <stdio.h>
#define N 1000
int num = 0;
int prime(int n)
{
	int i;
	if(n % 2 == 0)
		return (n == 2);
	if(n % 3 == 0)
		return (n == 3);
	if(n % 5 == 0)
		return (n == 5);
	for(i = 7; i*i <= n; ++i)
		if(n % i == 0)
			return 0;
	return 1;
}

void main()
{
	int i;
	for(i = 2; i < N; ++i)
		if(prime(i))
			printf("%-4d %d\n", ++num, i);
}

方法二(筛选法):

#include <stdio.h>
#include <math.h>
#include <time.h>
#define N 1000
bool tag[N+1] = {0};
int num = 0;
int prime(int n)
{
	int i;
	if(n % 2 == 0)
		return (n == 2);
	if(n % 3 == 0)
		return (n == 3);
	if(n % 5 == 0)
		return (n == 5);
	for(i = 7; i*i <= n; i += 2)
		if(n % i == 0)
			return 0;
	return 1;
}
void main()
{
	clock_t tic;
	tic = clock();
	int i, v, bound;
	bound = (int)sqrt((float)N);
	for(i = 2; i <= bound; ++i)
	{
		if(!prime(i))  tag[i] = 1;
		if(!tag[i]){
			v = i + i;
			while(v <= N){
				tag[v] = 1;
				v += i;
			}
		}
	}
	for(i = 2; i <= N; ++i)
		if(!tag[i])
			printf("%-4d %d\n", ++num, i);
	printf("%d ms\n", clock()-tic);
}

小算法笔记,布布扣,bubuko.com

时间: 2024-08-02 11:02:07

小算法笔记的相关文章

算法笔记-DTW动态时间规整

算法笔记-DTW动态时间规整 简介 简单的例子 定义 讨论 约束条件 步模式 标准化 点与点的距离函数 具体应用场景 分类 点到点匹配 算法笔记-DTW动态时间规整 动态时间规整/规划(Dynamic Time Warping, DTW)是一个比较老的算法,大概在1970年左右被提出来,最早用于处理语音方面识别分类的问题. 1.简介 简单来说,给定两个离散的序列(实际上不一定要与时间有关),DTW能够衡量这两个序列的相似程度,或者说两个序列的距离.同时DTW能够对两个序列的延展或者压缩能够有一定

算法笔记之堆排序

一.对堆排序的相关了解 1.堆排序的运行时间是 O(nlogn) : 2.定义: 堆heap是一棵具有以下属性的二叉树-- (1)它是一棵完全二叉树: (2)每个结点大于或等于它的任意一个孩子. 备注:完全二叉树的定义--除了最后一层没填满以及最后一层的叶子都是偏左放置的,其他层都是满的二叉树! 3.二叉堆有两种:最大堆和最小堆.在堆排序中我们使用的是最大堆,最小堆常常在构造优先队列时使用. 4.一条路径的深度指的是这条路径的边数,一个结点的深度是指从根结点到该结点的路径的长度. 二.对堆进行排

算法笔记之排序

最近在看<算法笔记>,如果单从算法来说,这本书真正做到了短小精悍,首先以排序入题,那么我们今天也来说说排序. 排序 将一堆杂乱无章的元素按照某种规则有序排列的过程就叫"排序".排序是一种非常基础的算法,有着广泛的理论和实践基础.对一个排序算法来说,一般从如下3个方面衡量算法的优劣: 时间复杂度:主要是分析关键字的比较次数和记录的移动次数. 空间复杂度:分析排序算法中需要多少辅助内存 稳定性:若两个记录A和B的关键字值相等,但排序后A.B的先后次序保持不变,则称这种算法是稳定

算法笔记之快速排序

1.1 算法思路-- 该算法在数组中选定一个元素作为主元(一般选第一个),然后以这个主元为参考对象将数组分为两个部分,第一部分都是小于或者等于主元,第二部分都是大于或者等于主元.然后对第一和第二部分递归地使用快速排序算法,直到分到最小的小组为止. 1.2 时间复杂度-- 在最差的情况下,要把n个元素的数组划分,需要n次比较和n次移动.假设用T(n) 来表示使用快速排序算法来排序n个元素的数组所耗费的时间.那么 T(n) = T(n/2)+ T(n/2) +2n 所以,快速排序的时间复杂度应该是

算法笔记(二)抽牌法产生随机全排列

上一章的算法笔记,并不算一个算法系列的一个合适的开始.而本章将会介绍一种产生随机全排列的方法,下一章开始,就正式开始我们的排序算法了. 在我们的排序算法演示器中,我们需要一组随机的数据来作为排序的开始,而本章,就会产生这么一组随机数据. (一)实现分析 我们需要一组随机的数据,而且似乎产生的方法不会太难.我们只需要通过rand()函数获得一个随机数,让其对count(排序的规模)取模,结果作为数组的索引,其值是当前已产生的随机数的个数,如果已经存在了,继续查找,直到产生随机数的个数与总数相同.

算法笔记--lca倍增算法

算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; int anc[20][N]; int deep[N]; int h[N]; void dfs(int o,int u,int w) { if(u!=o)deep[u]=deep[o]+1,h[u]=h[o]+w; for(int j=0;j<g[u].size();j++) { if(g[u][j]!=o) { anc[0][g[u][j]]=u; for(int i=1;i<

算法笔记之归并排序

4.归并排序 4.1算法思想-- 将数组分为两半,对每部分递归地应用归并排序,直到最后的子数组只包含一个元素.在每部分都排好序后,对它们进行合并. 4.2 时间复杂度-- 假如用T(n)表示使用归并排序对n个元素构成的数组进行排序而使用的时间,用mergeTime来表示将两个子分组合并起来而花费的时间.那么 T(n) = T(n/2)+T(n/2) + mergetime 而megeTime就是归并两个子数组所耗费的时间,以最大时间来算,最多需要n-1次来比较两个子数组的元素,然后n次移动到临时

java每日小算法(27)

/* [程序27]  题目:求100之内的素数    */ package test; import java.util.Scanner; public class test { public static boolean prime(int number) { boolean flag = true; int mid = (int)Math.sqrt(number); for(int i = 2; i< mid+1; i++) { if(number % i == 0) { flag = fa

java每日小算法(4)

[程序4] 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. package test; import java.util.ArrayList;