algorithm_C语言名题精选百则
文章平均质量分 71
theArcticOcean
Website: https://www.weiy.city
Wechat Subscription Account: 胡桃小院
展开
-
连续整数的固定积(C百例)
给定一个数字,要求把这个数字的连乘积求出来,比如给定了6,结果应该是1~3,给定了20,结果则是4~5。我解决这个问题的思路和《连续整数的固定和》的思路一样。程序可以把数据类型再改一下,扩大数据范围,因为具有连乘积性质的数字不太多。#include #include#includeusing namespace std;void f(int x){ int i=1,j=2,原创 2015-07-13 08:50:00 · 726 阅读 · 0 评论 -
无限式查找(C百例)
问题来源于《C语言名题精选百则-技巧篇》。因为不知道数组的元素个数,所以无法直接用二分法。但是我们可以用已知的元素及无限大元素来确定可能包含目标值的数组长度,这就又能用二分法了。#include #includeusing namespace std;int midfind(int f[],int q,int length){ int low=0,high=length,原创 2015-07-15 08:30:23 · 509 阅读 · 0 评论 -
寻找固定的和(C百例)
我优化的想法:将已知的两个数组进行排序,前者从小到大排序,后者从大到小排序。然后遍历第一个数组,针对每一个数字,再在第二个数组中查找,和大了向后找,dex++,找到了就count++且dex++,当a[i]+b[dex]产生输入数据:#include#include#includeusing namespace std;const int maxn=1e4;#define pi原创 2015-07-14 22:44:11 · 579 阅读 · 0 评论 -
寻找脚码(C百例,折半&&测时)
问题如上。因为已经排好了序,所以很容易联想到折半查找(二分)来提高效率。下面对普通方法和折半做一个对比:测试数据:#include#includeusing namespace std;const int maxn=1e7;int main(){ freopen("cout.txt","w",stdout); cout<<maxn<<endl; for(int i=1;i<9原创 2015-07-14 20:08:26 · 1665 阅读 · 0 评论 -
寻找极小值(C百例)
原问题来源于《C语言精选名题百则-技巧篇》描述:因为和顺序相关,所以初步估计和二分有关。自己干脆写一个普通的查找和二分做一个效率上的对比(先输出对应最小数再输出查找的时间):产生数据:#include #includeusing namespace std;int main(int argc, char *argv[]) { freopen("cout.tx原创 2015-07-23 17:26:32 · 734 阅读 · 0 评论 -
C语言名题精选百则:所有子集,字典子集,Gray子集
C语言名题百则 3.1 列出所有子集 (direct.c)分析:每一个元素只有两种可能,在子集中和不在子集中。#include #include using namespace std;int p[20],top;int main(){ int n; while(cin>>n){ for(int i=0;i<(1<<n);i++){原创 2015-10-18 09:30:57 · 935 阅读 · 0 评论 -
连续整数固定和(C百例 & 51nod 1138)
书上讲了一种提高效率的方法。原始算法:用i遍历1到n-1,如果i到j的和等于n那么就输出相应的结果。我们可以发现当sum(i,j)=n时,继续j++,sum+=j,计算的sum肯定是大于n的,于是便在sum(i,j)=n输出结果后,sum-=i,再继续sum+=j等后续工作,这样避免了无用功。#include #includeusing namespace std;void f(int原创 2015-07-13 00:09:27 · 765 阅读 · 0 评论 -
整数全排列(旋转法,next_permutation)
读了《C语言名题精选百则技巧篇》中的整数全排列,里面的算法是多样丰富的。看了旋转的基本思路和已经知道的最易用的next_permutation(),自己把两者都实现并且运行了一遍。只有不断学习,观察,猜想,推敲,实践才有可能弄懂算法的奥义。两种方式都产生相同数目的排列,但是次序是不同的。旋转:#include #includeusing namespace std; int原创 2015-05-29 21:59:33 · 1091 阅读 · 0 评论 -
排列、R子集字典序
n个元素的集合排列总个数是n!,可以这样简单的理解它:当只有1个元素时,排列数是1,插入一个元素有两种方法,所以f(2)=2对于3个元素相当于是在两个元素的基础上再插上1个元素:f(3)=f(2)×3=2×3这样推导下去:f(n)=1×2×3×……×n=n!有N个元素的集合{1,2,3,……N},当N非常大时,有这样的结果:由逆序数$a_{1},a_{2},\cdo原创 2015-10-20 15:15:10 · 1614 阅读 · 0 评论