zoukankan      html  css  js  c++  java
  • 数据结构与算法一

    题目一:求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 = 1000;
    
    int number[MAX_COUNT];
    
    void init()
    {
      //0-1000
    	for(int i=1; i <= MAX_COUNT; i++)
    		number[i] = rand()%MAX_VALUE;
    
    
    
    	for(int i=1; i <= MAX_COUNT; i++)
    		cout << number[i] << " ";
    	cout << endl;
    }
    
    void solve()
    {
    	int max, min, flag;
    	if((flag=MAX_COUNT%2))// 假设为真,1
    		max=min=number[1];
    	else{// 为偶数的情况
    		if(number[1]>number[2])
    		{
    			max = number[1];
    			min = number[2];
    		}else{
    			max = number[2];
    			min = number[1];
    		}
    	}
    
    
    
    
    	if(flag) flag = 2;
    	else flag = 3;
    	for(int i=flag; i < MAX_COUNT; i+=2)
    	{
    		if(number[i]>number[i+1])
    		{
    			if(number[i] > max)
    				max = number[i];
    			if(number[i+1] < min)
    				min = number[i+1];		
    		}else{
    			if(number[i+1] > max)
    				max = number[i+1];
    			if(number[i] < min)
    				min = number[i];
    		}
    	}
    	cout << "MAX = " << max << endl;
    	cout << "MIN = " << min << endl;
    }
    
    int main()
    {
      //随机函数的种子
    	srand(time(NULL));
    	init();// 初始化
    	solve();// 解决
    	return 0;
    }


    在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.         1 1

    2. 2 2 1+1

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

    4. 7 1+3 1+2+1 1+1+1+1 1+1+2 2+1+1 2+2 3+1

    5. 13 1+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+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;
    }


  • 相关阅读:
    家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转
    家庭记账本app进度之复选框以及相应滚动条的应用
    家庭版记账本app之常用控件的使用方法
    android 软件(app)之家庭版记账本首次进行helloword等相关测试
    家庭记账本app进度之android中AlertDialog的相关应用以及对日期时间的相关操作(应用alertdialog使用的谈话框)
    家庭版记账本app进度之关于android界面布局的相关学习
    家庭记账本app进度之关于单选按钮的相关操作(添加点击按钮事件以及点击单选更改事件)
    家庭记账本app进度之ui相关概念控制ui界面与布局管理
    家庭版记账本app进度之对于按钮的点击事件以及线性布局以及(alertdialog)等相关内容的应用测试
    乱了
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3810477.html
Copyright © 2011-2022 走看看