JAVA基础编程50题(4-6题)详解

来源:互联网 发布:时时彩组选计划软件 编辑:程序博客网 时间:2024/05/01 02:11

一、描述

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,否则为CString 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 {//若两个数互质,那么最坏的情况就是最大公约数是1for (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 {//若两个数互质,那么最坏的情况就是最大公约数是1for (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);}}

运行结果:

divMul


0 1