
Algorithm
文章平均质量分 63
CherylNatsu
这个作者很懒,什么都没留下…
展开
-
100!末尾零的个数
直接计算:#!/usr/bin/pythons = 1for i in range(1, 101):s *= icount = 0q = str(s)for i in reversed(q): if (int)(i) == 0: count += 1 else: breakprint count得到结果:24两个数的乘积能在末尾产生0的只有"偶数X5的倍数",1~100之间有50个偶数,但是5的倍数很少,其中5,10,15,20这样的数能产生一个0,共原创 2011-03-04 21:51:00 · 1742 阅读 · 0 评论 -
2等于1?
在虚构新闻看到这么一篇文章,叫《「2と1は等しい」 数学界で論議》,中间描述的那些故事就免去了,核心部分在下面这个证明过程:文字版本:a = ba^2 = aba^2 - b^2 = ab-b^2(a+b)(a-b) = b(a-b)a+b = b原创 2011-09-17 12:15:42 · 4025 阅读 · 2 评论 -
代码加行号打印
直接在终端显示文件的话是没有行数标记的,比如:$ cat a.c#include int main(int argc, const char *argv[]){ printf("Hello, world!\n"); return 0;}$ 用下面的脚本可以原创 2011-09-17 13:37:03 · 1630 阅读 · 3 评论 -
21位花朵数
花朵数是这么一个N位数,它的各个位数字的N次方之和为它的本身,比如:1^3+5^3+3^3=153现要求三分钟之内求解21位的水仙花数。#include #include #include #include #define N 21#define NU原创 2011-09-17 12:52:15 · 1191 阅读 · 0 评论 -
Move-to-front transform 算法
Move-to-front transform 算法#!/usr/bin/env python# Move-to-front transform algorithmdef move_to_front(src): dst = [] index原创 2011-09-22 21:23:44 · 3123 阅读 · 0 评论 -
Burrows–Wheeler transform 算法
Burrows–Wheeler transform 算法#!/usr/bin/python# Burrows–Wheeler transform Algorithmdef transform(s, start_symbol, end_symbol): s原创 2011-09-22 21:37:26 · 5658 阅读 · 0 评论 -
8皇后问题
8皇后问题太经典了,各种算法书解释回溯都用这个例子,下面是求解8皇后问题的代码:#include static int count;#define QUEEN_NUMBER 8#define NO_QUEEN -1#define TRUE 1#define FALSE 0#define ABS(x) ((x)>0?(x):(-(x)))int conflict(i原创 2011-11-09 11:51:27 · 1045 阅读 · 0 评论 -
计算Pi(1)
利用公式为:pi/4 = 1 - (1/3)+(1/5)-(1/7)+...+1/(4n-3)-1/(4n-1)#include double pi(int n){ double s = 0.0; int i; for (i = 1; i <= 4*n - 1; i += 2) { s += (1 / (double)i); i += 2; s -= (1原创 2012-02-09 23:36:29 · 1840 阅读 · 1 评论 -
计算Pi(2)
这次使用的是Gauss-Legendre算法,具体描述在:http://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_algorithm代码如下:#include #include int gauss_legendre(int precision){ double pi; double a, b, t, p; a = 1.0; b原创 2012-02-13 20:42:57 · 1918 阅读 · 0 评论 -
数学黑洞问题
“数学黑洞”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,最终会出现一个神秘的数,请编程输出这个神秘的数。#include #define INIT 1234#define SWAP(arr,i,j)\{arr[i]^=arr[j];arr[j]^=arr[i];arr[i]^=arr[j]原创 2012-06-01 16:48:02 · 4726 阅读 · 2 评论 -
堆排序(Heap Sort)
#include #include #include #define MAX 10void maxHeapify(int *arr, int i, int size){ int l = (i + 1) * 2 - 1; int r = (i + 1) * 2; int largest, t; if (l + 1 arr[i]) largest = l;原创 2011-07-02 13:21:12 · 941 阅读 · 0 评论 -
同时获取数组中的最大值和最小值
<br />找到一个数组中最大值一般用如下方法,首先拿出数组中第一个值作为当前的最大值,然后依次和后面所有的值比较,发现有比当前最大值还大的就更新最大值的记录:<br />int maximum(int *arr, int size){ int i; int max = arr[0]; for (i = 1; i < size; i++) { if (max < arr[i]) max = arr[i]; } return max;} <br />同理,原创 2011-05-03 12:51:00 · 9642 阅读 · 0 评论 -
bogo排序
<br />bogo是排序算法中的异类,它的原理非常简单,检查序列是否已经有序,如果有序就完成排序,否则打乱需要序列的顺序并重新执行判断,下面给出这个算法的实现。<br /> <br />/* 打乱数组的顺序 */void suffle(int *arr, int size){ int i, r, t; for (i = 0; i < size - 1; i++) { r = rand() % (size - i); t = arr[i]; arr[i原创 2011-05-02 09:48:00 · 3279 阅读 · 0 评论 -
高精度计算:梅森数(1)
有一类很经典的题目叫“高精度计算”。我当时特地去另一个城市听过一位计算机教育方面很著名的老师讲了10堂课,其中高精度计算专门用了一天来讲。当时我们使用的编程语言是Pascal,典型的古典语言,没有什么新特性,没有虚拟机,语法形式比C严格的多,数据类型当然也是很简单的,最普通的integer类型范围为-32768..32767,longint有-2147483648.。2147483647,再高一点的有extended为3.4e-4932..1.1e4932(精度无法保证)。这些数据类型远远不能达到“高精度计原创 2011-03-06 16:00:00 · 3916 阅读 · 1 评论 -
高精度计算:梅森数(2)
接上文:高精度计算:梅森数(1)如果使用传统语言,那么最好的方法就是用基本数据类型模拟大数数据类型,模拟手工计算达到目的,比如使用C语言:#include #include #include #include int main(int argc, const char *argv[]){ char digits[500 + 1]; int p, i, j, c = 0, r, l = 0; time_t time1, time2; memset(digits, 0原创 2011-03-06 16:27:00 · 2769 阅读 · 1 评论 -
快速判断文件是文本文件或二进制文件
<br /> <br />判断一个文件是文本文件还是二进制文件可以帮助压缩软件针对不同文件选择对应的算法,那么如何判断一个文件是是文本还是二进制呢?<br />旧版本的pkzip使用的方法是:如果80%以上的字节都落在7..127的范围里,就认为它是文本文件,否则它就是二进制文件。代码如下:<br /> <br /> <br />int isPlainText(const char *filename){ FILE *fp = fopen(filename, "rb"); long file原创 2011-05-11 20:19:00 · 6279 阅读 · 3 评论 -
质因数分解
<br />整数分解(Integer factorization)又叫质因数分解(质因子分解)是指把一个正整数写成几个素数的乘积。<br />最简单的算法是,从2到N进行试除,能整除的时候就说明找到了一个新的因子,而这个过程中因为是从较小的数开始除起所以必定会先找到能整除的最小的素数。<br />#include <stdio.h>void pd(int num){ int i; for (i = 2; i <= num; i++) if (!(num % i)) {原创 2011-05-16 08:32:00 · 3808 阅读 · 2 评论 -
Gray码
Gray码是一种数字编码方式,可以使相邻的两个数之间只有一位的差别。构造格雷码的方式很简单,首先列出01以底部为水平轴在轴下方写出轴上方的反射,并在轴上方数字左边都加0,轴下方数字都加1:00011110这只是2位的表示0~3的Gray码,重复相同操作还可以得到:000001011010110111101100通过这个方原创 2011-06-03 08:47:00 · 7821 阅读 · 0 评论 -
判断字符是否为英文字母
一个字节能表示0~255之间共256个数字,根据ASCII码英文字母A-Z和a-z按顺序排列,其中A = 65 = 0b01000001 = 0x41B = 66 = 0b01000010 = 0x42...Z = 90 = 0b01011010 = 0x5aa = 97 = 0b01100001 = 0x61b = 98 = 0b011原创 2011-06-13 19:50:00 · 13468 阅读 · 0 评论 -
简单的乱序算法
简单的乱许算法,思想是从n到1迭代,每次迭代随机从0到n-1中抽一个数与当前数字交换,最后得到的序列就是乱序的。该算法可以用于洗牌等地方。函数和测试程序如下: #include #include #include #define MAX 52#define swap(a, b) (a) ^= (b);(b) ^= (a);(a) ^= (b);int* shuffl原创 2011-06-17 09:33:00 · 6265 阅读 · 0 评论 -
计数排序算法
<br />首先计算数据的范围,然后为该范围内可能出现的元素建立一系列对应的计数器再重新扫描一遍同时根据扫描到的元素自增相应的计数器,最后把计数器内容读出来写回原数组。<br />int counterSort(int *data, int size){ if (data == NULL || size <= 0) return -1; int min = *data, max = *data; int *data_p = data + 1, *data_endp = data + s原创 2011-04-24 19:46:00 · 841 阅读 · 0 评论 -
用二叉查找数排序
<br />二叉查找树或二叉搜索树(Binary Search Tree),是这样一个二叉树:每个节点都有指向父parent和左孩子left_child,右孩子right_child的三个指针,如果没有父或子都可以指向NULL。如果每个节点都有值,而且左孩子的值<自己的值<右孩子的值。<br /> <br />我们可以利用这个特性来排序:首先从一个序列建立二叉查找树,把序列第一个元素作为根节点,然后依次抽出后面的数插入相应的位置。对二叉查找树进行中序遍历,这样就可以按顺序输出数字,实现排序。<b原创 2011-05-01 12:25:00 · 1245 阅读 · 0 评论 -
升序输出三个整数
有这么个问题,升序输出三个整数。最直观的方式当然是排序:#include void sort(int *arr, int count){ int i, j; for (i = 0; i for (j = i + 1; j { if (arr[i] > arr[j])原创 2014-05-31 00:38:55 · 3721 阅读 · 3 评论