算法
十觞亦不醉
编程浪子
展开
-
输出字符串的全部组合方式
题目 输入一个字符串,输出该字符串中字符的所有组合。分析 假设给定一字符串“abc”,则其所有组合方式为: a, b, ab, c, ac, bc, abc共七种(2^n - 1)种组合方式,可以利用位操作来简化题目,即给所有输出方式进行编号(1 ~ 2^n-1),对于本题目来说即: 0 0 1 --> a 0 1 0 --> b 0 1 1原创 2015-11-03 11:14:20 · 1914 阅读 · 1 评论 -
阶乘的尾递归(Tail Recursion)写法(C++)
一般的递归会导致递归调用栈的产生,深层递归下去将导致效率的下降,然而,部分递归问题是尾调用(Tail Call)的特殊形式,因而可以利用编译器进行优化,避免递归调用栈的产生,最常见的阶乘函数的尾递归写法如下:int fact(int n){ std::function k = [](int x) { return x; }; for(;;){ if (n ==原创 2015-11-04 19:53:19 · 1718 阅读 · 0 评论 -
利用三次实数相乘实现两复数相乘
两复数相乘,普通计算如下:(a + bi) * (c + di) = (a*c - b*d) + (a*d + b*c)i需要四次乘法,两次加法,而可以通过下面的方法优化:A = (a + b) * cB = (c + d) * bC = (b - a) * d(a + bi) * (c + di) = (A - B) + (B - C)i这样需要三次乘法五次加法,而对于计原创 2015-11-06 23:40:22 · 8686 阅读 · 6 评论 -
反转单链表
始终维护三个链表节点,即当前节点,前一个节点与下一个节点。#include #include #include #include #include using namespace std;struct Node{ int key; Node* next; Node(int k) : key(k), next(nullptr){}};Node* makeList原创 2016-03-08 17:44:37 · 373 阅读 · 0 评论 -
普通素数筛法
给定一个数N,得到N以内的所有素数,可以利用素数筛法来做,代码如下:#include #include #include #include using namespace std;vector sievePrimes(int n){ vector result; vector flag(n+1, true); flag[0] = flag[1]原创 2016-09-12 23:30:21 · 590 阅读 · 0 评论