1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入月数:");
int i = sc.nextInt();
int total = 0; //兔子总量
int before_demo1 = 1;//第一月数量
int before_demo2 = 1;//第二月数量
int before_demo = before_demo1 + before_demo2;//上月数量
int now_demo = 0;
if (i == 1 || i == 2){
System.out.println("兔子数量只有" + before_demo1 + "对");
}else if (i == 3){
System.out.println("兔子数量" + before_demo + "对");
}else {
for (int j = 0; j < i - 3; j++) {
now_demo = before_demo + before_demo2;
before_demo2 = before_demo; //上月赋给前月
before_demo = now_demo;//现月赋给上月
System.out.println("now:" + now_demo);
}
System.out.println("兔子数量" + now_demo + "对");
}
}
个人理解:排除不好循环的前几个月单独定义,之后依次将每月的数量赋值下移,上月赋给前月,现月赋给上月,完成位序下移后,相加即为本月结果【本月兔子数量 = 上月兔子数量 + 前月兔子数量】
2.题目:判断101-200之间有多少个素数,并输出所有素数。
前提补充:判断一个数是否为素数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入判断数:");
int i = sc.nextInt();
double j = Math.sqrt(i);
double u = Math.ceil(j); //向上取整
int c = Double.valueOf(u).intValue();//转化为int类型
for (int k = 2; k < c + 1; k++) {
if (i % k == 0){
System.out.println("该数不是素数");
return;
}
}
System.out.println("该数是素数");
}
判断条件:循环从2到根号X,一个数的两个因数中,毕然有一个小于等于根号X
常规判断:循环从2到X本身
个人补充:当循环条件判断到该数不是素数时,直接中断整个程序,否则输出该数是素数
public static void main(String[] args) {
int count = 0;
for (int i = 101; i < 201; i++) {
double j = Math.sqrt(i);
double u = Math.ceil(j); //向上取整
int c = Double.valueOf(u).intValue();//转化为int类型
int count_demo = 0;
for (int k = 2; k < c + 1; k++) {
if (i % k == 0){
count_demo++;
count++;
break;
}
}
if (count_demo == 0){
System.out.println(i);//输出素数
}
}
int y = 200 - 101 + 1 - count;
System.out.println("素数数量为:" + y);
System.out.println("不是素数数量为:" + count);
}
个人理解:素数的输出不好判断,则输出非素数的输出,最后用总数减去非素数数量,则得出素数数量;用一个值来判断是否运行了非素数判断,运行了不为0,反之则为0,为0,则输出当前数
3.题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
前提补充:取得输入数字,各个位数上的数字
int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100 % 10; int qian = i / 1000 % 10;通用取得位数数字公式
Math.pow(a, b)//计算a的b次方
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("输出判断数:");
int i = sc.nextInt();
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 ;
int j = (int) (Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3));
if (j == i){
System.out.println("该数为水仙花数");
}else {
System.out.println("该数不是水仙花数");
}
}
个人理解:根据取出各个位数上数字的公式,取出数值后,后续就方便计算了
4.题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list_demo = new ArrayList<>();
Scanner sc = new Scanner(System.in);
System.out.println("请输入判断数:");
int i = sc.nextInt();
int y = i;
double j = Math.sqrt(i);
double u = Math.ceil(j); //向上取整
int c = Double.valueOf(u).intValue();//转化为int类型
//获取整除数组
for (int k = 2; k < c + 1; k++) {
if (i % k == 0) {
list.add(k);
}
}
System.out.println(list);
//循环判断整除
for (int k = 0; k < list.size(); k++) {
while (i % list.get(k) == 0) {
list_demo.add(list.get(k));
i = i / list.get(k);
}
}
System.out.println(list_demo);
//输出
String s = y + "=";
for (int k = 0; k < list_demo.size(); k++) {
if (k == 0){
s = s + "" + list_demo.get(k);
}else {
s = s + "*" + list_demo.get(k);
}
}
System.out.println(s);
}
个人理解:先判断,输入的数能被哪些数整除,并存入数组;将输入数,循环重复被整除数组第一个数整除,直到这个数不能被第一个数整除后,开始被下一个数整除,每整除一次,添加一次进入下个数组,循环输出下个数组即为因数
5.题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入成绩:");
int i = sc.nextInt();
char str = i >= 90 ? 'A' :
i >= 60 ? 'B' : 'c';
System.out.println(str);
}
个人理解:嵌套条件不清楚的时候,分开写就行
6.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list_demo = new ArrayList<>();
ArrayList<Integer> list_add = new ArrayList<>();
ArrayList<Integer> list_demo_add = new ArrayList<>();
ArrayList<Integer> max = new ArrayList<>();
Scanner sc = new Scanner(System.in);
System.out.println("输入第一个正整数:");
int i = sc.nextInt();
int i1 = i;
System.out.println("输入第二个正整数:");
int j = sc.nextInt();
int j1 = j;
for (int k = 2; k < i + 1; k++) {
if (i % k == 0){
list.add(k);
}
}
for (int k = 2; k < j + 1; k++) {
if (j % k == 0){
list_demo.add(k);
}
}
//最大公约数
for (int k = 0; k < list.size(); k++) {
for (int l = 0; l < list_demo.size(); l++) {
if (list.get(k) == list_demo.get(l)){
max.add(list.get(k));
}
}
}
int u = max.size() - 1;
System.out.println("最大公约数为:" + max.get(u));
//分解因式
//循环判断整除
for (int k = 0; k < list.size(); k++) {
while (i % list.get(k) == 0) {
list_add.add(list.get(k));
i = i / list.get(k);
}
}
System.out.println(list_add);
for (int k = 0; k < list_demo.size(); k++) {
while (j % list_demo.get(k) == 0) {
list_demo_add.add(list_demo.get(k));
j = j / list_demo.get(k);
}
}
System.out.println(list_demo_add);
//最小公倍数
int z = (i1 / max.get(u)) * (j1 / max.get(u)) * max.get(u);
System.out.println("最小公倍数:" + z );
}
个人理解:最大公约数,找出正整数的各个因数,比较记录存入数组,最后存入数组的即为最大公约数;最小公倍数,输入的正整数,除去最大公约数,再相乘,再乘最大公约即为最小公倍数
7.题目:输入一行字符,分别统计出其英文字母、空格的个数。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char ch[] = s.toCharArray();
int count = 0;
int number = 0;
for (int i = 0; i < ch.length; i++) {
if ((ch[i] >= 97 && ch[i] <= 122) || (ch[i] >= 65 && ch[i] <= 90)){
count++;
}else if (ch[i] == 32){
number++;
}
}
System.out.println("字母数量为:" + count);
System.out.println("空格数量为:" + number);
}
个人理解:输入为nextLine,可以录入空格,将输入的字符串转为数组,数组字符的比较是Ascall码,对比相同的Ascall码,或者范围内的Ascall码,即可确定输入的内容是什么
8.题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入计算数字:");
int i = sc.nextInt();
System.out.println("输入计算位数:");
int j = sc.nextInt();
int total = 0;
int temp = 0;
int add = 0;
String add_demo = "s";
for (int k = 0; k < j; k++) {
temp = (int) (i * Math.pow(10,k));
total = temp + total;
add = add + total;
if (k == 0){
add_demo = add_demo + "=" + total;
}else {
add_demo = add_demo + "+" + total;
}
}
System.out.println("总数为:" + add);
System.out.println(add_demo);
}
个人理解:记录清楚每次需要叠加的值,再用空白字符串,相加转为字符串叠加即可
9.题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
int temp = 0;
for (int i = 1; i < 1001; i++) {
list.removeAll(list);
temp = 0;
for (int j = 1; j < i + 1; j++) {
if (i % j == 0 && j != i) {
list.add(j);
}
}
for (int j = 0; j < list.size(); j++) {
temp = temp + list.get(j);
}
if (temp == i) {
System.out.println(i);
System.out.println(list);
}
}
}
个人理解:用数组记录因子,再遍历数组并相加,就可得出答案
10.题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
public static void main(String[] args) {
double down = 0;
double up = 0;
double high = 100.0;
double half_high = 50.0;
for (int i = 0; i < 10; i++) {
down = high + down;
high = high / 2;
}
System.out.println(down);
for (int i = 0; i < 9; i++) {
up = half_high + up;
half_high = half_high / 2;
}
System.out.println(up);
double total = down + up;
System.out.println("总共经过了" + total + "米");
System.out.println("第十次反弹高度为" + half_high + "米");
}
个人理解:将落地和升高分开看,分别计算,就可以得出答案