N阶幻方

摘要: N阶幻方,思路如下:把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数:(1)、每一个数放在前一个数的右上一格;(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。 1 #include "stdafx.h" 2 #include 3 const int Max = 100; 4 in 阅读全文
posted @ 2013-12-25 22:42 光明小天使 阅读(459) 评论(0) 推荐(0) 编辑

三种初级排序(选择、插入、冒泡)

摘要: 选择排序:每次从剩余数组中选择一个最小的,然后从0开始和相应位置的数字作交换,假设数组长度为n,外层遍历n次,内层查找n-1次,时间复杂度为Θ(n^2): 1 void SelectionSort(int * x,int length) 2 { 3 //外层遍历 4 for(int i = 0;i 0 ;j--) 8 { 9 if(x[j] 0 j++) 9 {10 if(x[j] < x[j - 1])11 {12 int temp = ... 阅读全文
posted @ 2013-11-13 22:47 光明小天使 阅读(155) 评论(0) 推荐(0) 编辑

八皇后(回溯经典)

摘要: 在8 * 8的棋盘上,摆放8个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上,问共有多少种摆法,并且用程序输出这些摆法。八皇后作为回溯法的经典例题还是值得一做的,这道题基本可以分成以下步骤:1.初始化棋盘,0代表没有皇后,1代表有皇后。2.剪枝函数(判断同一行、同一列或同一斜线上是否有皇后)3.回溯主程序4.打印棋盘程序如下: 1 #include "stdafx.h" 2 #include 3 const int Max = 8; 4 const int chessMen = 1; 5 int count = 0; 6 //初始化棋盘 7 int chessb 阅读全文
posted @ 2013-11-04 14:09 光明小天使 阅读(322) 评论(0) 推荐(0) 编辑

高精度阶乘(大数运算)

摘要: 题目很简单,输入一个数n,求n的阶乘n!。乍一看这道题真是简单,但是仔细一想当20!的时候,结果已经接近20位,哪怕是无符号的长整形,估计也放不了几个数,那么当这样的大数运算的时候应该怎么办了?我们可以想一想,当我们在做乘法的时候是每一位相乘,然后低位进位,高位相加,最后得出结果,而对于每一位都是10以内的乘法,这就很简单了,所以在大数相乘中我们引入本位数组的概念(自己造的)和进位数组的概念。例如:初始化本位数组f[n] 和进位数组add[0] ,分别赋初值为0;5! =120,用本位数组表示就是f[1] = 0;f[2] = 2;f[3] = 1,当计算6!的时候f[1] = 0 * 6 = 阅读全文
posted @ 2013-11-02 17:18 光明小天使 阅读(301) 评论(0) 推荐(0) 编辑

跳棋(利用规范的数学方法)

摘要: 水平方向上有n个格子,格子上写着1到n的数字中的一个,游戏规则是:走到某一格,上面的数字假如是s,则可以选择跳到第s个格子或者前进一格,问你最少要走多少步才能到达最后一格并且返回起点。如:353265,你去的时候可以一步一步到终点(5步),也可以一开始就跳到第三格,再一步一步到终点(4步),或者先前进一步再跳到第5格再一步一步地走(3步),最少是3步到达。然后要再返回的时候,最少步数的走法是,左移两步再跳到第二格再左移一步(4步),共7步。分析:刚开始做的时候没有头绪,用的基本等于猜的方法,比如从题中第一格开始,到第三格,然后返回来查是否还有大的数字(比如5),这种方法最后加了很多复杂的约束, 阅读全文
posted @ 2013-11-01 00:16 光明小天使 阅读(2103) 评论(0) 推荐(0) 编辑

贪心砝码(分治法)

摘要: 被贪心和分治又虐了一天,还是太弱了..题目是这样的:有这样一个奇怪的天平,它的砝码只有1g, 3g, 9g, 27g......并且各只有一个,但它却能够称出所有整数g质量的物体例如要称出质量2g,那就一边放一个3g,另一边放物体和1g的砝码就可以了。放在物体那边的砝码在前面加负号表示之。有候选集合,需要求近似解或者最优解,这基本是贪心分治的标配,而核心思想就是根据候选集合不断的迭代问题的规模使其缩小,代码如下: 1 #include "stdafx.h" 2 #include 3 #include 4 #define Max 21 5 //构造候选集合,自己做的时候已经被 阅读全文
posted @ 2013-10-30 23:37 光明小天使 阅读(532) 评论(0) 推荐(0) 编辑

大数乘方取余

摘要: 输入a,n(1 3 //由于输入的数可能比较大,所以定义无符号的长整型 4 unsigned long int Exponent_mod(const unsigned int a, unsigned int n,const unsigned int k) 5 { 6 unsigned long int r = 1,b = a; 7 //当输入指数为0时 8 if(n == 0) 9 {10 return r;11 }12 while(n)13 {14 //由于是b=a是由低位到高位递增,而n/=2是高位到... 阅读全文
posted @ 2013-10-28 16:36 光明小天使 阅读(1537) 评论(0) 推荐(0) 编辑

二分法查找

摘要: 二分法是一个快速查找的简单算法,当然它要求查找的数组是有序的,看起来好像比暴力要麻烦一些,但是即便加上排序,logn+logn也要比n小,因此在即便加上排序,也要比暴力的时间效率高很多(小白见解,不对请指正,不胜感激),例题代码如下: 1 #include "stdafx.h" 2 #include 3 #include 4 #include 5 //首先明白原理和能写出来还是有很多差距的,其次对于C输入数组,数组作为参数传递,指针的应用等等都还需要慢慢去理解... 6 int DichotomySearch(int Array[],int k,int n) 7 { 8 i 阅读全文
posted @ 2013-10-27 13:07 光明小天使 阅读(257) 评论(0) 推荐(0) 编辑

汉诺塔(经典递归)(未完全明白)

摘要: 作为经典递归的汉诺塔算法题, 迄今为止这是第二次被虐的,然而更惨的是还是没有虐明白,当然比第一次要理解的略深一点,这是唯一可以欣慰的,分析如下:递归这种东西,不能深钻,很容易被各种逻辑搞混,所以要用一种大局观去解决问题,基本上整个汉诺塔分为四部分:1.把A上的n-1个通过C移动到B上2.把A上的最后一个移动到C上3.把B上的n-1个通过C移动到A上4.把B上的最后一个移动到C 1 #include "stdafx.h" 2 #include 3 int i = 0; 4 void Print(int n,char a,char b,char c) 5 { 6 //相当于1. 阅读全文
posted @ 2013-10-24 17:59 光明小天使 阅读(332) 评论(0) 推荐(0) 编辑

斐波那契数列和

摘要: 求1/1+2/1+3/2+5/3+8/5+13/8...一直到n的值,首先看到这个题基本上都能反应出要找规律,而一般找规律的都可以尝试用递推法先求出f(n),然后循环或者递归求和,但是这道题每一项的分子和分母都被拆分运算,因此无法运用递推法。然后找规律吧,第一次呢,我是推出第三项的分子等于前两项的分子之和,分母等于前两项的分母之和,但是写出程序之后发现程序十分不简洁,后来上网发现,后一项的分子等于前一项的分母、分子之和,后一项的分母等于前一项的分子这样的规律也是成立的,而且程序看上去更舒服,代码如下: 1 int k,n; 2 float num =0; 3 //分子、... 阅读全文
posted @ 2013-10-22 23:28 光明小天使 阅读(307) 评论(0) 推荐(0) 编辑