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];
}
}