一、描述
1、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,输出之前的所有因子。
(2)如果n!=k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
2、利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b这是条件运算符的基本例子。
3、输入两个正整数m和n,求其最大公约数和最小公倍数。
二、源代码
1、程序1
package tong.yue.hong; import java.util.Scanner; /* * 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 */ public class Zhiyinshu { public static void main(String[] args) { System.out.println("Please input a number bigger than one:"); Scanner scan = new Scanner(System.in); int num = scan.nextInt(); while (num<=1) { System.out.println("input number error,please input again!"); num = scan.nextInt(); } decompose(num); decompose2(num); } /** * 使用字符串的拼接 * @param n */ private static void decompose(int n){ System.out.print(n+"="); for(int i=2;i<=n;i++){ while(n%i==0 && n!=i){ n/=i; System.out.print(i+"*"); } if(n==i){ System.out.println(i); break; } } } /** * StringBuilder将输出结果格式化 * @param num */ private static void decompose2(int num){ StringBuilder sBuilder = new StringBuilder(); sBuilder.append(num+"="); int i = 2; while(num!=1){ if(num%i==0){ sBuilder.append(i+"*"); num /=i; }else { i++; } } String resulString=sBuilder.toString(); System.out.println(resulString.substring(0, resulString.length()-1)); } }
运行结果:
2、程序2
package tong.yue.hong; import java.util.Scanner; /** * 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 程序分析:(a>b)?a:b这是条件运算符的基本例子。 * @author Administrator * */ public class GradeLevel { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Please input a score:(0-100)"); int score = scanner.nextInt(); while(score<0||score>100){ System.out.println("Input score error,please input a score again:"); score = scanner.nextInt(); } //条件运算符的嵌套,如果大于等于90分就输出等级A,否则继续判断是否大于等于60,若是则是B,否则为C String level = score>=90?"A":score>=60?"B":"C"; System.out.println(score+"分的等级为"+level); } }
运行结果:
3、程序3
package tong.yue.hong; import java.util.Scanner; /** * 输入两个正整数m和n,求其最大公约数和最小公倍数。 * @author tong * */ public class CommonDivMulpi { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Please input the first number(num>0):"); int firstNum = scanner.nextInt(); while(firstNum<0){ System.out.println("Input error,Please input the first number again(num>0):"); firstNum = scanner.nextInt(); } System.out.println("Please input the second number(num>0):"); int secondNum = scanner.nextInt(); while(secondNum<0){ System.out.println("Input error,Please input the second number again(num>0):"); secondNum = scanner.nextInt(); } //如果两个数相等,则最小公倍数就是其中之一,无需调用方法判断 if (firstNum==secondNum) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+firstNum); greatCommonDivisor(firstNum,secondNum); }else { leastCommonMultiple(firstNum,secondNum); greatCommonDivisor(firstNum,secondNum); } max_min(firstNum,secondNum); } /** * 求最小公倍数:首先获取该两个数的较大者,若两者中的较大者是较小者的倍数,则该较大者则为两数最小公倍数 * 本代码采用列举倍数法:如果两者不成倍数关系,则取较大数的倍数(从2开始一次往上增加), * 用该数除以较小的数,如果可以整除,该数就是要求者,否则继续取倍数重复以上部分 * 例如:12与20的最小公倍数,20不能整除12,将20*2=40,40不能整除12 ,将20*3=60,此时60可以整除12,所以二者最小公倍数为60 * @param firstNum * @param secondNum */ private static void leastCommonMultiple(int firstNum, int secondNum) { //判断两者中的较大者 if (firstNum>secondNum) { if (firstNum%secondNum==0) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+firstNum); }else { //若两个数互质,那么最坏的情况就是公倍数是两者的乘积 for (int i = 2; i <= secondNum; i++) { if (firstNum*i%secondNum==0) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+firstNum*i); break; } } } }else { if (secondNum%firstNum==0) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+secondNum); }else { //若两个数互质,那么最坏的情况就是公倍数是两者的乘积 for (int i = 2; i <= firstNum; i++) { if (secondNum*i%firstNum==0) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+secondNum*i); break; } } } } } /** * 最大公约数求法:若两数成倍数关系,则较小的那个数就是最大公约数 * 否则,较小数循环除以较小数之的所有因子(从小到大)的结果去循环除较大数,如果能整除,该数就是最大公约数,否则继续循环 * 例如:36和10求最大公约数,36不是10的倍数,则用较小数10的因子去除较小数,除后结果去除36,则用36%(10/2)=36%5无法整除,36%(10/5)=36%2==0整除,所以最大公约数是2 * @param firstNum * @param secondNum */ private static void greatCommonDivisor(int firstNum, int secondNum) { //判断两者中的较大者 if (firstNum>secondNum) { if (firstNum%secondNum==0) { System.out.println(firstNum+"和"+secondNum+"的最大公约数为"+secondNum); }else { //若两个数互质,那么最坏的情况就是最大公约数是1 for (int i = 2; i <= secondNum; i++) { //取出较小数的因子 if (secondNum%i==0&&firstNum%(secondNum/i)==0) { System.out.println(firstNum+"和"+secondNum+"的最大公约数为"+(secondNum/i)); break; } } } }else { if (secondNum%firstNum==0) { System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+firstNum); }else { //若两个数互质,那么最坏的情况就是最大公约数是1 for (int i = 2; i <= secondNum; i++) { //取出较小数的因子 if (firstNum%i==0&&secondNum%(firstNum/i)==0) { System.out.println(firstNum+"和"+secondNum+"的最大公约数为"+(firstNum/i)); break; } } } } } /** * 求最大公约数和最小公倍数,使用辗转除法,同时求最大公约数和最小公倍数 * 其中最大公约数是该两个数中所有相同因子的乘积,而最小公倍数则是所有相同的分解因子和各自特有的因子的乘积 * @param m * @param n */ private static void max_min(int firstNum, int secondNum){ int m = firstNum; int n = secondNum; int temp = 1; int yinshu = 1; int beishu = m*n; //将两数中的较小者放在前面 if(n<m){ temp = n; n = m; m = temp; } //使用辗转除法 while(m!=0){ temp = n%m; n = m; m = temp; } yinshu = n; beishu /= n; System.out.println(firstNum+"和"+secondNum+"的最大公约数为"+yinshu); System.out.println(firstNum+"和"+secondNum+"的最小公倍数为"+beishu); } }
运行结果:
时间: 2024-10-09 04:26:22