华为机试:求最小公倍数、Ja题目2-3级(走格子)

1.求最小公倍数

题目描述

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

输入描述:

输入两个正整数A和B。

输出描述:

输出A和B的最小公倍数。

示例1

输入

5 
7

输出

35

import java.util.Scanner;  

public class Main3 {  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        int a = scan.nextInt();  
        int b = scan.nextInt(); 
        //之前我一直还不知道,最小公倍数与最大公约数还有这个关系
        System.out.println(a*b/getMaxMult(a,b));  
    }  
      
    private static int getMaxMult(int a, int b) {  
    	//循环取余,最后输出b
        int m = a % b;  
        while (m != 0) {  
        	a=b;
        	b=m;
        	m=a%b;
        }  
        return b;  
    }  
}

2.Ja题目2-3级(走格子)

题目描述

请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

输入描述:

输入两个正整数

输出描述:

返回结果

示例1

输入

2
2

输出

6
package JianZOffer;

import java.util.Scanner;

//算法1:用递归来实现
public class Main1 {  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        int a = scan.nextInt();  
        int b = scan.nextInt(); 
        System.out.println(getMaxNum(a,b));  
    }  
      
    private static int getMaxNum(int a, int b) {
    	if(a==1)
    		return b+1;
    	else if(b==1)
    		return a+1;
    	else{
    		return getMaxNum(a-1,b)+getMaxNum(a,b-1);
    	}
    }  
}

//算法2:
//组合数学思想:(m+n)的阶乘除以m与n分别的阶乘的积
public class Main2{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			int m=sc.nextInt();
			
			int top=factorial(m+n);
			int behind=factorial(m)*factorial(n);
			System.out.println(top/behind);
		}
	}

	private static int factorial(int n) {
		int sum=1;
		for (int j = 0; j <=n; j++) {
			sum*=j;
		}
		return sum;
	}
}

//算法3:
//动态规划思想 	dp[][]第一行为1,第一列为1,其余dp[i][j] = dp[i-1][j] + dp[i][j-1]
public class Main3{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			int m=sc.nextInt();
			System.out.println(getdp(n,m));
		}
	}

	private static int getdp(int n, int m) {
		int [][]dp=new int[n+1][m+1];
		dp[0][0]=0;
		for (int i = 0; i <=n; i++) {
			dp[i][0]=1;
		}
		
		for (int j = 0; j <=m; j++) {
			dp[0][j]=1;
		}
		
		for (int i = 1; i <=n; i++) {
			for (int j = 1; j <=m; j++) {
				dp[i][j]=dp[i][j-1]+dp[i-1][j];
			}
		}
		return dp[n][m];
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值