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

一、描述

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

JAVA基础编程50题(4-6题)详解的相关文章

JAVA基础编程50题(1-3题)详解

一.题目描述 1.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... ,该题其实就是斐波那契数列的一种. 2.判断m-n之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数n分别去除2到sqrt(n),这里是Math自带的函数sqrt()求该数的平方根,如果能被整除,则表明此数不是素数,反之是素数. 3.打印出所有的

JAVA基础编程50题(22-24题)详解

一.描述 题目1:统计输入的一段字符串,分别统计这个字符串中大小写字母的个数,以及数字出现的次数. 第一种方法使用Character封装类的方法:isLowerCase(),isUpperCase(),isDigit()判断是否是该类字符, 第二种方法是直接使用char字符范围比较来统计. 题目2:用户输入一串待统计的字符串,然后输入用户想要统计的某个单词或者字符的次数. 比如我输入如下字符串:fdhiaojavajidaoijdjava 我要统计其中的java字符串的个数. 解题思路:传入待统

JAVA基础编程50题(7-9题)详解

一.描述 1.输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的总个数和每个字符出现的频率. 程序分析:使用String类的matchs()分别统计符合正则表达式的每类字符的总个数,然后分别使用List和Map集合类统计每个字符出现的频率. 2.求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制. 3.题目:一个数如果恰好等于它的因子之和,这个数就称为"完数",即除了本身

JAVA基础编程50题(13-15题)详解

一.描述 1.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后再平方等于原数则符合结果. 2.输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 3.输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析:将最小的数放到x上,先

JAVA基础编程50题(25-27题)详解

一.描述 题目1:判断一个数字是否是2的阶次方数,例如8,16,64,256都是2的阶次方数. 题目解析:如果一个数是2的阶次方数,那么这个数字的二进制数的首位为1,后面跟着若干个0,例如8用二进制表示为1000,64为1000000, 如果让这个数减1,然后和这个数做按位&运算即得0,即(number-1)&number==0,8&7=1000&0111=0000. 题目2:列出一个数组中所有元素的组合,比如1.2.3列出来为1.12.123.13.132.2.21.21

JAVA基础编程50题(10-12题)详解

一.描述 1.一球从m米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第n次落地时,共经过多少米?第10次反弹多高? 2.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.但是必须满足每一位上的数字各不相同,根据排列组合原理总共有4*3*2=24种. 3.企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高

java基础编程题

java基础编程题 1.打印出如下图案 1 public class Prog19{ 2 public static void main(String[] args){ 3 int n = 5; 4 printStar(n); 5 } 6 7 //打印星星 8 private static void printStar(int n){ 9 //打印上半部分 10 for(int i=0;i<n;i++){ 11 for(int j=0;j<2*n;j++){ 12 if(j<n-i) 1

6、50道JAVA基础编程练习题跟答案

1 50道JAVA基础编程练习题 2 [程序1] 3 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 4 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 5 public class Prog1{ 6 public static void main(String[] args){ 7 int n = 10; 8 System.out.println("第"+n+

50道JAVA基础编程练习题

50道JAVA基础编程练习题[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....public class Prog1{public static void main(String[] args){ int n = 10; System.out.println("第"+n+"个月兔子总数为"+f