zoukankan      html  css  js  c++  java
  • 三道简单算法题

    阶乘和问题

    问题描述

    输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤106,n!表示前n个正整数之积。

    实现思路

    首先是要求阶乘和最后求末六位,但是注意到n≤106,所以计算和的时候只需要加上后六位就行(因为第七位之前的一定会被模),这样也保证了使用int类型不会溢出。

    核心代码

    public static void main(String[] args) {
    		Scanner scn=new Scanner(System.in);
            int n=scn.nextInt();
            int i=1,s=1,sum=0;
            //计算n的阶乘和
            while(i<=n){
                    s*=i;
                    s%=1000000;
                    sum+=s;
                    i++;
            }
            //计算后六位
            sum%=1000000;
            System.out.println(sum);
    	}
    

    运行截图


    猴子吃桃问题

    问题描述

    猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?编写递归函数实现问题

    实现思路

    每天吃一半加一只,则第二天也是吃第一天吃完的剩下的一半加一只。很明显,这个问题在每一天时都是重复的子问题。问题要求用递归函数实现问题。很容易想到递归出口就是第九天桃子数等于0,n==9时,f(n)=0。而递归公式就是f(n)=f(n-1)/2-1。摘来的桃子数就是f(0)。

    核心代码

            /**
    	 * 表示第n天的桃子数
    	 * @param n 第n天
    	 * @return 桃子数
    	 */
    public static int f(int n) {
    		if(n==9) return 0;
    		return 2*(1+f(n+1));
    	}
    
    

    运行截图


    矩阵连乘的乘法次数问题

    问题描述

    给定若干矩阵的行数和列数,要去给出一种计算方法,即加括号的表达式,计算按照这个表达式的顺序计算,应该计算多少次基本的实数乘积。例如:A是5010的,B是1020的,C是205。则(A(BC))的乘法次数为10205(BC的乘法次数)+ 5010*5((A(BC))的乘法次数)= 3500

    实现思路

    使用栈的数据结构。遇到字母时入栈,遇到右括号时出栈并计算,然后将结果入栈。因为输入保证合法,括号无须入栈。

    核心代码

    static class Juzhen{
    		int x;
    		int y;
    		Juzhen cal(Juzhen another) {
    			if(this.y!=another.x)
    				return null;
    			num+=x*y*another.y;
    			return new Juzhen(x,another.y);
    		}
    		public Juzhen(int x, int y) {
    			this.x = x;
    			this.y = y;
    		}
    	}
    	private static int num=0;
    	private static Map<String,Juzhen> map=new HashMap();
    	public static void getNum(String exp) {
    		Stack<Juzhen> s=new Stack<Juzhen>();
    		int i=0;
    		s.add(null);
    		while(i<exp.length()) {
    			 if(exp.charAt(i)=='('){//入栈
    				s.add(null);
    			}else if(exp.charAt(i)==')') {//出栈
    				Juzhen p1=s.pop();
    				Juzhen p2=s.pop();
    				s.add(p2.cal(p1));
    			}else {//字母
    					Juzhen t=map.get(exp.charAt(i)+"");
    					Juzhen p=s.pop();
    					if(p!=null)
    						s.add(p.cal(t));
    					else
    						s.add(t);
    			}
    			i++;
    		}
    	}
    	public static void main(String[] args) {
    		map.put("A", new Juzhen(50,10));
    		map.put("B", new Juzhen(10,20));
    		map.put("C", new Juzhen(20,5));
    		
    		getNum("A(BC)");
    		System.out.println(num);
    	}
    
    

    运行截图

  • 相关阅读:
    【NOIp复习】图论算法模板合集
    【NOI导刊】【归并排序求逆序对】最接近神的人
    【NOIp 2012】【线段树】借教室
    【NOIp复习】最近公共祖先LCA&区间最大最小RMQ
    【NOIp 2015】【二分答案】跳石头
    【NOIp 2015】【DFS】斗地主
    【vijos】【BFS+hash】毒药?解药?
    【NOIp模拟】【dp】俄罗斯方块
    【NOIp模拟】【二分图or并查集】GoToandPlay
    【vjios】【DFS】切蛋糕
  • 原文地址:https://www.cnblogs.com/code-fun/p/12871923.html
Copyright © 2011-2022 走看看