更新时间又太晚了,拖的时间太长了。下次注意,争取每天一更。
今天的主题是算法,以后一个月的时间都是关于算法的了。
问题1:求两个从键盘输入的数的最大公约数和最小公倍数
顺序理解
(1)先求最大公约数
(2)再求最小公倍数
最大公约数
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法
代码:
while(max%min!=0){ //一个while循环
int temp=max%min; //先拿最大数除以最小数
max=min; //得到余数以后,一直拿被除数和余数相除
min=temp;
}
return min; //知道余数为0
例:gcd(39,23)
39/23=1(余16)
23/16=1(余7)
16/7=2(余2)
7/2=3(余1)
2/1=2(余0) //到这里就停止了
最小公倍数
得到最大公约数之后,求最小公倍数很简单
lcm=(a/gcd)*(b/gcd)*gcd
拿其中一个数除以最大公约数,再乘以另一个数
代码
新建一个最大公约数类
class CalcGCD{
public static int calcGCG(int a,int b){
//使用辗转相除法计算最大公约数
int max=0;
int min=0;
if(a>b){
max=a;
min=b;
}else{
max=b;
min=a;
}
while(max%min!=0){
int temp=max%min;
max=min;
min=temp;
}
return min;
}
}
再新建一个最小公倍数的类
class CalcLCM{
public static int calcLCM(int a,int b){
int gcd=CalcGCD.calcGCG(a,b);
int lcm=(a/gcd)*(b/gcd)*gcd;
return lcm;
}
}
主函数和主类
import java.util.Scanner;
public class Study_20161202002{
public static void main(String[] args){
System.out.println("请输入第一个整数: ");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
System.out.println("请输入第二个整数: ");
int b=sc.nextInt();
System.out.println(a+"和"+b+"的最大公约数为: ");
System.out.println(CalcGCD.calcGCG(a, b));
System.out.println(a+"和"+b+"的最小公倍数为: ");
System.out.println(CalcLCM.calcLCM(a, b));
}
}
问题2:关于多重if语句的判断
原理图
语法
if(条件1){
if(条件2){
代码块1;
}else{
代码块2;
}
}else{
代码块3;
}
逻辑理解
如果外层if成立,则继续经过内层if
如果内层if成立,经过继续往下层if
一直成立,则顺序往下
且不管else
如果外层if不成立,则下面所有if不成立
直接到第一个else
代码
public class Study_20161202004 {
public static void main(String[] args){
int num;
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数: ");
num=sc.nextInt();
if(num%3==0){
System.out.println("number id divisible by 3");
if(num%2==0){
System.out.println("number is divisible by 2");
}
}
else{
if(num%5==0){
System.out.println("number is divisible by 5");
}
}
}
}
输出结果
请输入一个数:
60
number id divisible by 3
number is divisible by 2