原文链接:
https://blog.csdn.net/qq_42756994/article/details/82801524
1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
第一个月兔子总数:1对
第二个月兔子总数:1对
第三个月兔子总数:2对
第四个月兔子总数:3对
第五个月兔子总数:5对
发现这是一个斐波拉契数,也就是说满足:S(n-2)+S(n-1)=S(n)
递归可以算出某一个月的兔子的对数
public class Test04 {
public static void main(String[] args) {
System.out.println(getDuiShu(5));
}
private static int getDuiShu(int month) {
if (month == 0) {
return 0;
} else if (month == 1) {
return 1;
} else if (month == 2) {
return 1;
} else {
return getDuiShu(month - 1) + getDuiShu(month - 2);
}
}
}
现在要算出每个月兔子的对数并打印出来
package com.wx.day10;
public class Test04 {
public static void main(String[] args) {
getDuiShuEveryMonth(6);
}
private static void getDuiShuEveryMonth(int month) {
for (int i = 1; i <= month; i++) {
System.out.println("第" + i + "个月的兔子的对数为:" + getDuiShu(i));
}
}
private static int getDuiShu(int month) {
if (month == 0) {
return 0;
} else if (month == 1) {
return 1;
} else if (month == 2) {
return 1;
} else {
return getDuiShu(month - 1) + getDuiShu(month - 2);
}
}
}
2.判断101-200之间有多少个素数,并输出所有素数。
先默认这个数是素数,然后判断,如果是则输出,如果不是跳出循环判断下一个数
package com.wx.day10;
public class Test05 {
public static void main(String[] args) {
isSuShu();
}
private static void isSuShu() {
int count = 0;
boolean flag;
for (int i = 101; i <= 200; i += 2) {
flag = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag == true) {
count++;
System.out.println(i + "是素数");
}
}
System.out.println("总共有" + count + "个素数");
}
}
3.题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
package com.wx.day10;
public class Test06 {
public static void main(String[] args) {
isShuiXianHua();
}
private static void isShuiXianHua() {
int count = 0;
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
for (int i = 100; i < 1000; i++) {
char[] chars = String.valueOf(i).toCharArray();
digit1 = Integer.valueOf(String.valueOf(chars[0]));
digit2 = Integer.valueOf(String.valueOf(chars[1]));
digit3 = Integer.valueOf(String.valueOf(chars[2]));
if (liFang(digit1) + liFang(digit2) + liFang(digit3) == i) {
System.out.println(i + "是水仙花数");
count++;
}
}
System.out.println("共" + count + "个水仙花数");
}
private static int liFang(int num) {
return num * num * num;
}
}
4.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
小学数学没学好,先补习一些知识,根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
所以输入的这个数需要大于2,从2开始找到输入的这个数的因数,判断它是否是质数,质数就要输出来,这个逻辑只能找到所有的质因数,比如90的质因数是2,3,5,而不会分解成2,3,3,5。所以需要分解,如何分解呢?拿这个输入的数去依次处以他的所有质因数就达到分解的效果了。从二除起走,如果除得尽,则判断它是不是质数,然后输入的数替换一下就好了。
package com.wx.day11;
import java.util.Scanner;
public class Test01 {
/**
* 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
Integer integer = Integer.valueOf(line);
try {
System.out.print(integer + "=");
getZhiYinShu(integer);
} catch (Exception e) {
System.out.println(e);
}
}
private static void getZhiYinShu(int num) throws Exception {
if (num >= 2) {
int k = 2;
while (k <= num) {
if (k == num && isZhiShu(k)) {
System.out.print(k);
break;
} else if (num % k == 0 && isZhiShu(k)) {
System.out.print(k + "*");
num = num / k;
} else {
k++;
}
}
} else {
throw new MyException("参数错误!");
}
}
private static boolean isZhiShu(int num) {
for (int i = 2; i < num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
5.输入两个正整数m和n,求其最大公约数和最小公倍数
先求出最大公约数,最大公约数就是两个数取模,有等于0和不等于0的两种情况,如果等于0,那么最大公约数就是小的那个数,如果不等于0,比如6和9,9%6=3,6%3=2,3%2!=0,返回3.
package com.wx.day11;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
/**输入两个正整数m和n,求其最大公约数和最小公倍数*/
Scanner scanner = new Scanner(System.in);
String NumA = scanner.nextLine();
String NumB = scanner.nextLine();
int greatestCommonDivisor = getGreatestCommonDivisor(Integer.valueOf(NumA), Integer.valueOf(NumB));
System.out.println("最大公约数:" + greatestCommonDivisor);
System.out.println("最小公倍数:" + getMaximumCommonMultiple(Integer.valueOf(NumA), Integer.valueOf(NumB)));
}
/**
* 最大公约数,比如6,9
*/
private static int getGreatestCommonDivisor(int numA, int numB) {
int max = 0;
int min = 0;
max = numA > numB ? numA : numB;
min = numA < numB ? numA : numB;
if (max % min != 0) {
return getGreatestCommonDivisor(min, max % min);
}
return min;
}
/**
* 最大公倍数
*/
private static int getMaximumCommonMultiple(int NumA, int NumB) {
return NumA * NumB / getGreatestCommonDivisor(NumA, NumB);
}
}
6.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
package com.wx.day11;
import java.util.Scanner;
public class Test03 {
/**
* 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
getNumber(line);
}
private static void getNumber(String string) {
if (string == null || " ".equals(string)) {
System.out.println("输入字符串为空");
}
int english = 0;
int blank = 0;
int shuzi = 0;
int qita = 0;
char[] chars = string.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] >= 'A' && chars[i] <= 'Z' || chars[i] >= 'a' && chars[i] <= 'z') {
english++;
} else if (chars[i] == ' ') {
blank++;
} else if (chars[i] >= '0' && chars[i] <= '9') {
shuzi++;
} else {
qita++;
}
}
System.out.println("英文=" + english);
System.out.println("空格=" + blank);
System.out.println("数字=" + shuzi);
System.out.println("其他=" + qita);
}
}
7.求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
package com.wx.day11;
import java.util.Scanner;
public class Test04 {
/**
* 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String number = scanner.nextLine();
String numbers = scanner.nextLine();
int result = getResult(Integer.valueOf(number), Integer.valueOf(numbers));
System.out.println(result);
}
private static int getResult(int number, int numbers) {
int sum = 0;
int num = number;
for (int i = 0; i < numbers; i++) {
sum += num;
num = Integer.valueOf(String.valueOf(num) + number);
}
return sum;
}
}
8.一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
package com.wx.day11;
public class Test05 {
public static void main(String[] args) {
/**一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数。*/
wanShu();
}
private static void wanShu() {
for (int i = 1; i <= 1000; i++) {
if (yinZihe(i) == i) {
System.out.println(i + "是完数");
}
}
}
/**
* 找出一个数的所有因子相加
*/
private static int yinZihe(int number) {
int sum = 0;
for (int i = 1; i < number; i++) {
if (number % i == 0) {
sum += i;
}
}
return sum;
}
}
9.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
package com.wx.day11;
import java.text.DecimalFormat;
import java.util.Scanner;
public class Test06 {
public static void main(String[] args) {
/**一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?*/
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
getResult(Integer.valueOf(line));
}
private static void getResult(int number) {
float totalM = 100;
float totalJingguo = 0;
for (int i = 1; i <= number; i++) {
totalJingguo += totalM;
totalM = totalM / 2;
}
DecimalFormat decimalFormat = new DecimalFormat("0.00");
System.out.println("第" + number + "落地时总共经过" + decimalFormat.format(totalJingguo));
System.out.println("第" + number + "落地时反弹" + decimalFormat.format(totalM));
}
}
10.有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输入。
package com.wx.day11;
import java.util.ArrayList;
import java.util.List;
public class Test07 {
public static void main(String[] args) {
/**有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输入。*/
getResult();
}
private static void getResult() {
int count = 0;
for (int x = 1; x < 5; x++) {
for (int y = 1; y < 5; y++) {
for (int z = 1; z < 5; z++) {
if (x != y && y != z && z != x) {
System.out.println(x * 100 + y * 10 + z);
count++;
}
}
}
}
System.out.println("共有" + count + "个这样的三位数");
}
}
11.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
package com.wx.day11;
public class Test08 {
public static void main(String[] args) {
/**一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?*/
getResult();
}
private static void getResult() {
for (int i = 1; i <= 100000; i++) {
if (Math.sqrt(i + 100) % 1 == 0) {
if (Math.sqrt(i + 268) % 1 == 0) {
System.out.println(i);
}
}
}
}
}
12.输入某年某月某日,判断这一天是这一年的第几天?
package com.wx.day11;
import java.util.Scanner;
public class Test09 {
public static void main(String[] args) {
/**输入某年某月某日,判断这一天是这一年的第几天?*/
Scanner scanner = new Scanner(System.in);
String year = scanner.nextLine();
String month = scanner.nextLine();
String day = scanner.nextLine();
getResult(Integer.valueOf(year), Integer.valueOf(month), Integer.valueOf(day));
}
private static void getResult(int year, int month, int day) {
switch (month) {
case 1:
getDay(0, day);
break;
case 2:
getDay(0, day);
break;
case 3:
if (isRuiNian(year)) {
getDay(60, day);
break;
} else {
getDay(59, day);
break;
}
case 4:
if (isRuiNian(year)) {
getDay(91, day);
break;
} else {
getDay(90, day);
break;
}
case 5:
if (isRuiNian(year)) {
getDay(121, day);
} else {
getDay(120, day);
}
case 6:
if (isRuiNian(year)) {
getDay(152, day);
} else {
getDay(151, day);
}
break;
case 7:
if (isRuiNian(year)) {
getDay(182, day);
} else {
getDay(181, day);
}
break;
case 8:
if (isRuiNian(year)) {
getDay(213, day);
} else {
getDay(212, day);
}
break;
case 9:
if (isRuiNian(year)) {
getDay(244, day);
} else {
getDay(243, day);
}
break;
case 10:
if (isRuiNian(year)) {
getDay(274, day);
} else {
getDay(273, day);
}
break;
case 11:
if (isRuiNian(year)) {
getDay(305, day);
} else {
getDay(304, day);
}
break;
case 12:
if (isRuiNian(year)) {
getDay(335, day);
} else {
getDay(334, day);
}
break;
}
}
private static boolean isRuiNian(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
}
return false;
}
private static void getDay(int days, int day) {
System.out.println("这一天是这一年的第" + (days + day) + "天");
}
}
13.给出一组数,计算出他们组合后的最大值