首页 > 代码库 > 数据结构与算法一
数据结构与算法一
题目一:求1!+2!+…..+n! 的和的后6位,(注意n的范围)
#include <iostream> using namespace std; const int MAX = 1000000; int getResu(int n) { int sum=0; int temp= 1; for(int i=1; i <= n; i++) { temp *= i; temp %= MAX; sum += temp; sum %= MAX; } return sum ; } int main() { int n; while(cin>>n) { if(n > 0) cout << getResu(n) << endl; else cout << "Please input a integer greater than zero !" <<endl; } return 0; }
题目二:一个长度为N 的序列中,求最大值和最小值并输出。最后分析可能存在的优化性。
#include <iostream> #include <cstdlib> // 设置随机函数 #include <ctime> using namespace std; const int MAX_COUNT = 10000; const int MAX_VALUE = http://www.mamicode.com/1000;>在N个数中找出最大最小值的方法是显然的,只要分别独立地找出最小值和最大值,这各需要n-1 比较,假定第一个最大最小共需2n-2比较。事实上,只需要最多3(n/2)次比较就可以。具体的方法是记录已知的最大最小值,但并不是将每一个输入元素与当前的最大最小值进行比较-----因为这样做的代价是每个元素需要2次比较。每一个元素和最大比较一次。最小值一次。而是对输入的元素进行成对比较。首先,对输入的一对元素进行相互比较,然后把较小的值与当前的最小值进行比较,把较大的值与当前最大值进行比较。这样对每两个元素共需要三次的比较,少于上述的4次比较。如何设定已知的最小值和最大值的初始值依赖于n 是奇数还是偶数。如果n 是奇数,我们就将最小值和最大值
设为第一个数的值。如果n 是偶数,那么就将第一个数和第二个数做比较,较小的值就是当前的最小值较大的值就是当前的最大值,接下来的数就成对的比较,取较小和当前最小比,取较大和当前最大比。最后来分析一下总的比较次数,如果n 是奇数,那么总共进行3(n/2)次比较,如果n 是偶数,则是 3(n-2)/2+1 次比较,至多是3(n/2)。题目三:排列问题
参考我的另一篇博客:http://blog.csdn.net/china_zoujinyong/article/details/17588897
题目四:台阶问题
问题描述:我们学校北区食堂一楼到二楼的楼梯一共有17个台阶,正常人的你一次可以选择迈1个台阶,2个台阶,或3个台阶,问你从最底下走上17个台阶,一共有多少种走法?
解法一:
上n个台阶的方法等于上n-1个台阶和n-2个台阶和n-3个台阶的方法之和
台阶数 方法 步骤
11
22 1+1
43 1+2 1+1+1 2+1
71+3 1+2+1 1+1+1+1 1+1+2 2+1+1 2+2 3+1
131+1+1+1+1 1+2+2 2 +1+2 1+2+1 1+1+3 3+1+1 1+3+1
1+2+1+1 1+1+2+1 2+1+1+1 1+1+1+2 2+3 3+2
6 24 1+1+1+1+1+1 2+1+1+1+1 (5种) 3+1+1+1 (4种)
2+2+1+1(6种)2+3+1(6种)3+3 2+2+2
#include <iostream> using namespace std; int recu(int n) { if(n==1) return 1; if(n==2) return 2; if(n==3) return 4; return recu(n-1)+recu(n-2)+recu(n-3); } int main() { int n; cin >> n; cout << recu(n) << endl; return 0; }
方法二:设置一个容器,往里面放东西(1,2,3,),如果容器里面数的值等于给定的n 的值的大小,那么满足条件,作为一次结果保存起来。
#include <iostream> using namespace std; int n, resu=0; int number[3]={1,2,3}; void recu(int count) { if(count==n) { resu++; return ; } if(count > n) return ; for(int i=0; i < 3; i++) { count += number[i]; recu(count); count -= number[i]; } } int main() { cin >> n; recu(0); cout << resu << endl; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。