三道简单算法题

 

阶乘和问题

问题描述

输入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);
	}

运行截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值