首页 > 代码库 > 数据结构与算法一

数据结构与算法一

题目一:求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个台阶的方法之和

台阶数 方法 步骤

  1.         11

  2. 22 1+1

  3. 43 1+2 1+1+1 2+1

  4. 71+3 1+2+1 1+1+1+1 1+1+2 2+1+1 2+2 3+1

  5. 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+16种)2+3+16种)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;
}