首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++经典算法-PI算法

17.Algorithm Gossip: 长 PI 说明 圆周率后小数位数是无止境,如何使用电脑来计算这无止境小数是一些数学家与程式设计师所感兴趣,在这边介绍一个公式配合 大数运算,可以计算指定位数圆周率...[]为高斯符号,也就是取至整数(不大于L/1.39794整数);为了计简方便,可以在程式中使用下面这个公式来计简第n项: [W -1/52- V -1 / (2392)] / (2*n-1) 这个公式算法配合大数运算函式算法为...: div(w, 25, w); div(v, 239, v); div(v, 239, v); sub(w, v, q); div(q, 2*k-1, q) 至于大数运算算法,请参考之前文章,...必须注意是在输出时,由于是输出阵列中整数值,如果阵列中整数位数不满四位,则必须补上0,在C语言中只要 使用格式指定字%04d, 使得不足位数部份自动补上0再输出,至于Java部份,使用 NumberFormat...c[i] < 10000) carry = 0; else { // 进位 c[i] = c[i] - 10000;

76220
您找到你想要的搜索结果了吗?
是的
没有找到

C++经典算法-数字拆解

31.Algorithm Gossip: 数字拆解 说明 这个题目来自于 数字拆解,我将之改为C语言版本,并加上说明。...解法 我们以上例中最后一个数字5拆解为例,假设f( n )为数字n可拆解方式个数,而f(x, y)为使用y以下数字来拆解x方法个数,则观察: 5 = 4 + 1 = 3 + 2 = 3 + 1...y)),其中n为要拆解数字,而min()表示取两者中较小数。...使用一个二维阵列表格table[x][y]来表示f(x, y),刚开始时,将每列索引0与索引1元素值设定为1,因为任何数以0以下数拆解必只有1种,而任何数以1以下数拆解也必只有1种: for(i...= 0; i < NUM +1; i++){ table[i][0] = 1; // 任何数以0以下数拆解必只有1种table[i][1] = 1; // 任何数以1以下数拆解必只有1种 }

1.1K00

C++经典算法-稀疏矩阵

46.Algorithm Gossip: 稀疏矩阵 说明 如果在矩阵中,多数元素并没有资料,称此矩阵为稀疏矩阵(sparse matrix), 由于矩阵在程式中常使用二维阵列表示,二维阵列大小与使用记忆体空间成正比...,如果多数元素没有资料,则会造成记忆体空间浪费,为 此,必须设计稀疏矩阵阵列储存方式,利用较少记忆体空间储存完整矩阵资讯。...解法 在这边所介绍方法较为简单,阵列只储存矩阵行数、列数与有资料索引位置及其值,在需要使用矩阵资料时,再透过程式运算加以还原,例如若矩阵资料如下 ,其中0表示矩阵中该位置没有料: 0 0 0 0...0 0 0 3 0 0 0 0 0 0 0 6 0 0 0 0 9 0 0 0 0 0 0 0 12 0 这个矩阵是5X6矩阵,非零元素有4个,您要使用阵列第一列记录其列数、行数与非零元素个数: 5...6 4 阵列第二列起,记录其位置列索引、行索引与储存值: 1 1 3 2 3 6 3 2 9 4 4 12 所以原本要用30个元素储存矩阵资讯,现在只使用了15个元素来储存,节省了不少记忆体使用

84610

C++经典算法-字串核对

11.Algorithm Gossip: 字串核对 说明 今日一些高阶程式语言对于字串处理支援越来越强大(例如Java、Perl等),不过字 串搜寻本身仍是个值得探讨课题,在这边以Boyer-...解法 字串搜寻本身不难,使用暴力法也可以求解,但如何快速搜寻字串就不简单了,传统 字串搜寻是从关键字与字串开头开始比对,例如 Knuth-Morris-Pratt 演算法 字串搜寻,这个方法也不错...,不过要花时间在公式计算上;Boyer-Moore字串核对改由关键字后面开始核对字串,并制作前进表,如果比对不符合则依前进表中值前进至下一个核对处,假设是p好了,然后比对字串中p-n+1至p值是否与关键字相同...如果关键字中有重复出现字元,则前进值就会有两个以上值,此时则取前进值较小值, 如此就不会跳过可能位置,例如texture这个关键字,t前进值应该取后面的3而不是取前面的 7。

19840

C++经典算法-约瑟夫问题

26.Algorithm Gossip: 约瑟夫问题(Josephus Problem) 说明 据说着名犹太历史学家 Josephus有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus...然而Josephus 和他朋友并不想遵从,Josephus要他朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。...解法 约瑟夫问题可用代数分析来求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您与您朋友?...,41个人而报数3约琴夫排列如下所示: 14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10...41 21 11 28 39 12 22 33 13 29 23 由上可知,最后一个自杀是在第31个位置,而倒数第二个自杀要排在第16个位置,之前的人都死光了,所以他们也就不知道约琴夫与他朋友并没有遵守游戏规则了

90910

C++经典算法-背包问题

,最后得到就是最佳解。...以背包问题为例,我们使用两个阵列value与item,value表示目前最佳解所得之总价,item表示最后一个放至背包水果,假设有负重量 1~8背包8个,并对每个背包求其最佳解。...逐步将水果放入背包中,并求该阶段最佳解: 由最后一个表格,可以得知在背包负重8公斤时,最多可以装入9050元水果,而最后一个装入 水果是3号,也就是草莓,装入了草莓,背包只能再放入...7公斤(8-1)水果,所以必须看背包负重7公斤时最佳解,最后一个放入是2号,也就 是橘子,现在背包剩下负重量5公斤(7-2),所以看负重5公斤最佳解,最后放入是1号,也就是苹果,此时背包负重量剩下...C代码 #include #include #define LIMIT 8 // 重量限制#define N 5 // 物品种类#define MIN 1 /

42630

C++经典算法-产生可能集合

29.Algorithm Gossip: 产生可能集合 说明 给定一组数字或符号,产生所有可能集合(包括空集合), 例如给定1 2 3,则可能集合为: {}、{1}、{1,2}、{1,2,3}、{...解法 如果不考虑字典顺序,则有个简单方法可以产生所有的集合,思考二进位数字加法,并注意1出现位置,如果每个位置都对应一个数字,则由1所对应数字所产生就是一个集合,例如: ?...,如果有n个元素要产生可能集合,当依序产生集合时,如果最后一个元素是n,而倒数第二个元素是m的话,例如: {a b c d e n} 则下一个集合就是{a b c d e+1},再依序加入后续元素。...代码示例 C无字典顺序 #include #include #define MAXSIZE 20 int main(void) {...(",%d", j + 1); printf("}"); } printf("\n"); return 0; } C字典顺序

57620

C++经典算法-河内之塔

河内之塔 说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国,河内为越战时北越首都,即现在胡志明市;1883年法国数学家 Edouard...,且搬运过程中遵守大盘子在小盘子之下原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。...如果盘数超过2个,将第三个以下盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住部份,其实就是进入程式递回处理。..."Move sheet %d from %c to %c\n", n, A, C); } else { hanoi(n-1, A, C, B); printf...("Move sheet %d from %c to %c\n", n, A, C); hanoi(n-1, B, A, C); } } int main() {

26720

C++经典算法-八枚银币

9.Algorithm Gossip: 八枚银币 说明 现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少比较次数,决定出哪枚是假币...解法 单就求假币问题是不难,但问题限制使用最少比较次数,所以我们不能以单纯回圈比较来求解,我们可以使用决策树(decision tree),使用分析与树状图来协助求解。...一个简单状况是这样,我们比较a+b+c与d+e+f ,如果相等,则假币必是g或h,我们先比较g或h哪个较重,如果g较重,再与a比较(a是真币),如果g等于a,则g为真币,则h为假币,由于h比g轻而...g是真币,则h假币重量比真币轻。

20030
领券