基础(4)目录
循环题100
1、打印九九乘法表
import java.text.MessageFormat;
public class Practise100 {
public static void main(String[] args){
for (int i = 1,sum; i <10 ; i++) {
for (int j = 1; j <=i ; j++) {
sum=j*i;
System.out.print(MessageFormat.format("{0}*{1}+{2}",i,j,i*j));
}
System.out.println();
}
}
}
代码运行结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
2、输入两个正整数m和n,求其最大公约数和最小公倍数
import java.util.Scanner;
public class Practise100 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入m的大小:");
int max = input.nextInt();
System.out.print("请输入n的大小:");
int min = input.nextInt();
for (int i = min; i >0 ; i--) {
if(min%i==0 && max%i==0){
System.out.print("m和n的最大公约数为:"+i);
break;
}
}
System.out.println();
for (int i = 1; i<=min ; i++) {
int k=max*i;
if(k%min==0){
System.out.print("m和n的最小公倍数为:"+(max*i));
break;
}
}
}
}
代码运行结果:
请输入m的大小:36
请输入n的大小:9
m和n的最大公约数为:9
m和n的最小公倍数为:36
Process finished with exit code 0
3、搬砖问题
搬砖问题:36 块砖,36 人搬,男搬 4,女搬 3,两个小孩抬 1 砖,要求一次全搬完,问男、女和小孩各若干?
import java.text.MessageFormat;
public class Practise100 {
public static void main(String[] args){
int a,b,c=0;
for ( a=9,b=12; a>0 ; a--) {
if(4*a+3*b+0.5*(36-a-b)!=36){
if(b>0){
b--;
a++;}else{
a--;
b=12;
}
}else {
c=36-a-b;
System.out.print(MessageFormat.format("需要男人{0}个,女人{1}个,小孩{2}个",a,b,c));
}
}
}
}
代码运行结果:
需要男人3个,女人3个,小孩30个
4、猴子吃桃问题
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个; 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
public class Practise100 {
public static void main(String[] args){
int sum=1;
for (int i = 0; i <10 ; i++) {
sum=(sum+1)*2;
}
System.out.print(sum);
}
}
代码运行结果:
3070
5、打印金字塔型的数字
import java.util.Scanner;
public class Practise100 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入您需要打印数字金字塔的高度:");
int height= input.nextInt();
double y=0,z=0;
for (int i = 0; i <= height-1; i++) {
for (int n = height-1-i; n >0 ; n--) {
System.out.print("\t");
}
for (int j = 0; j <= i; j++) {
y = Math.pow(2, j);
System.out.print((int) y + "\t");
if (i == j) {
for (int k = j; k >= 0; k--) {
z = Math.pow(2, k-1);
if(k>0){
System.out.print((int)z+ "\t");
}else if(k==1)
{
System.out.print((int)z+"\n");
}
}
}
}System.out.println();
}
}
}
代码运行结果:
请输入您需要打印数字金字塔的高度:8
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
6、完全平方数
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(完全平方指用一个整数乘以自己例如11,22,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。)
import java.util.Scanner;
public class Practise100 {
public static void main(String[] args){
for (int j = 11; j<10000; j++) {
for (int i = 0; i <10000; i++) {
if(j*j==i+100){
for (int k = 17; k <10000; k++) {
if(k*k==i+100+168){
System.out.print(i+"\t");
}
}
}
}
}
}
}
代码运行结果:
21 261 1581
7、兔子繁殖问题
有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对?
import java.util.Scanner;
public class Practise100 {
int[] arr= new int[13] ;
arr[0] =1;
arr[1] =2;
arr[2] =3;
arr[3] =4;
for (int i = 4; i <= arr.length-1; i++) {
arr[i]= arr[i-3]*2+(arr[i-1]-arr[i-3]);
}
System.out.print("一对兔子12个月能繁殖成"+arr[11]+"对");
}
}
代码运行结果:
一对兔子12个月能繁殖成88对
8、年历
import java.util.Scanner;
public class Practise100 {
//先算距起始年份的整年的总天数
Scanner input = new Scanner(System.in);
System.out.print("请输入需要打印日历的年份:");
int year =input.nextInt();
int sum=0;
boolean isLeadYear2= (year%4==0&&year%100!=0)||year%400==0;
for (int i = 1900; i<year; i++) {
boolean isLeadYear= (i%4==0&&i%100!=0)||i%400==0;
sum += isLeadYear?366:365;
}
int count=sum%7;
//开始打印
for (int i = 1; i <=12 ; i++) {
int day=0;
System.out.println();
System.out.println(year + "年" + i + "月");
System.out.println("一\t二\t三\t四\t五\t六\t日");
//算出每个月1号前需要空几格
for (int k = count % 7 ; k > 0; k--) {
if (k == 0) {
break;
} else {
System.out.print("\t");
}
}
//判断每个月的天数
switch(i){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day=31;
break;
case 4: case 6: case 9: case 11:
day=30;
break;
case 2:
day=isLeadYear2?29:28;
break;
}
//打印时每行七个,打印至月底换行退出
for (int j = 1; j <=day ; j++) {
//每个月1号直接接着上个月的空格后输入即可
if(j==1){
System.out.print(j);
}else {
if ((j + count) % 7 == 1) {
System.out.print("\n" + j);
} else {
System.out.print("\t" + j);
}
}
}
count += day;
System.out.println();
}
}
}
代码运行结果:
请输入需要打印日历的年份:2003
2003年1月
一 二 三 四 五 六 日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2003年2月
一 二 三 四 五 六 日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
2003年3月
一 二 三 四 五 六 日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
2003年4月
一 二 三 四 五 六 日
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
2003年5月
一 二 三 四 五 六 日
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
2003年6月
一 二 三 四 五 六 日
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
2003年7月
一 二 三 四 五 六 日
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
2003年8月
一 二 三 四 五 六 日
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
2003年9月
一 二 三 四 五 六 日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
2003年10月
一 二 三 四 五 六 日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2003年11月
一 二 三 四 五 六 日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
2003年12月
一 二 三 四 五 六 日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
9、三角形
循环使用方法:(D*i+X)=Y(i↑ y↑) (X-D*i)=Y (i↑ y↓)
import java.util.Scanner;
public class Practise100 {
//倒置直角
for (int i = 1; i <=5 ; i++) {
for (int j = 1; j <=6-i ; j++) {
System.out.print("*");
}System.out.println();
}
System.out.println();
//倒置等边
for (int j = 1; j <=5 ; j++) {
for(int i=1;i<=j-1;i++){
System.out.print(" ");
}
for (int k = 0; k <11-2*j; k++) {
System.out.print("*");
}
System.out.println();
}
System.out.println();
//倒置等边掏空
for (int j = 1; j <=5 ; j++) {
for(int i=1;i<=j-1;i++){
System.out.print(" ");
}
for (int k = 1; k <=11-2*j; k++) {
boolean first = j==1 ||j==5 || k==1 || k==11-2*j;
System.out.print(first?"*":" ");
}
System.out.println();
}
System.out.println();
//菱形上下分开写
for (int i = 1; i <=5 ; i++) {
for (int j = 1; j <=5-i ; j++) {
System.out.print(" ");
}
for (int j = 1; j <=2*i-1 ; j++) {
System.out.print("*");
}System.out.println();
}
for (int j = 1; j <=4 ; j++) {
for(int i=1;i<=j;i++){
System.out.print(" ");
}
for (int k = 0; k <9-2*j; k++) {
System.out.print("*");
}
System.out.println();
}
System.out.println();
//菱形整体一起写
for (int i = 1,k=1; i>=1; i=k++<5 ? ++i :--i) {
for (int j = 1; j <= 5-i ; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2*i-1; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println();
//菱形(对称写法)上下对称
for (int i = -4; i <=4 ; i++) {
for (int j = 1; j <=Math.abs(i) ; j++) {
System.out.print(" ");
}
for (int j = 1; j <=9-2*Math.abs(i) ; j++) {
boolean first = Math.abs(i)==4|| j==1||j==9-2*Math.abs(i);
System.out.print(first?"*":" ");
}System.out.println();
}
System.out.println();
//沙漏(对称)
for (int i = -4; i <=4 ; i++) {
for (int j = 1; j <=4-Math.abs(i) ; j++) {
System.out.print(" ");
}
for (int j = 1; j <=2*Math.abs(i)+1 ; j++) {
System.out.print("*");
}System.out.println();
};
System.out.println();
//沙漏掏空
for (int i = -4; i <=4 ; i++) {
for (int j = 1; j <=4-Math.abs(i) ; j++) {
System.out.print(" ");
}
for (int j = 1; j <=2*Math.abs(i)+1 ; j++) {
boolean first= Math.abs(i)==4||Math.abs(i)==0||j==2*Math.abs(i)+1||j==1;
System.out.print(first?"*":" ");
}System.out.println();
}
}
}
代码运行结果:
*****
****
***
**
*
*********
*******
*****
***
*
*********
* *
* *
* *
*
*
***
*****
*******
*********
*******
*****
***
*
*
***
*****
*******
*********
*******
*****
***
*
*
* *
* *
* *
* *
* *
* *
* *
*
*********
*******
*****
***
*
***
*****
*******
*********
*********
* *
* *
* *
*
* *
* *
* *
*********
10、数组生成后查找以及排序
随机生成100个数,任何单值重复不超过两次,取值1~50之间的整数;找出数组中所有数值中不重复的质数;用插入排序法为数组中的数值升序排序
第一种方法
public class Practise100 {
public static void main(String[] args){
//第一种方法
//生成数组
for (int i = 0,t,count; i <100; i++) {
count=0;
t= 1+ rand.nextInt(50);
for (int j = 0; j < i; j++) {
if(arr[j]==t) {
count++;
}
}
if(count<2){
arr[i]=t;
}else{
i--;
}
}
for (int i : arr) {
System.out.print(i+"\t");
}
System.out.println();
System.out.println();
//找出不重复的质数
int[] arr1 = new int[N];
for (int i = 0,count,count1=0; i < arr.length; i++) {
count = 0;
count1 = 0;
for (int j = 1; j <= arr[i]; j++) {
if (arr[i] % j == 0) {
count++;
}
}
if (count < 3 && count > 1) {
for (int k = 0; k < arr1.length; k++) {
if(arr1[k]==arr[i]){
count1++;
}
}
}else{
continue;
}
if(count1==0){arr1[i]=arr[i];}
}
for (int i = 0; i < arr1.length; i++) {
if(arr1[i]!=0) System.out.print(arr1[i]+"\t");
}
System.out.println();
System.out.println();
//插入排序(降序排序)
for (int i = 1,j,t; i <= arr.length-1; i++) {
t=arr[i];
for ( j = i-1; j >=0 && arr[j]< t ; j--) {
arr[j+1]=arr[j];
}
arr[j+1] =t;
}
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
第二种方法
import java.util.Random;
public class Practise100 {
public static void main(String[] args){
//第二种方法
//生成数组
Random rand = new Random();
final int N =100;
int[] uqarr= new int[N];
int[] uqcnt= new int[N];
int[] arr = new int[N];
int ix=0;
for (int i = 0,t,tx; i < arr.length;) {
t=1+rand.nextInt(50);
tx=-1;
for (int j = 0; j <ix ; j++) {
if(t==uqarr[j]){
tx=j;
break;
}
}
if(tx!=-1 &&uqcnt[tx]>=2){ continue;}
arr[i++]=t;
if(tx==-1){
uqarr[ix]=t;
uqcnt[ix++]++;
}else{uqcnt[tx]++;}
}
for (int i = 0; i < ix ; i++) {
System.out.println(uqarr[i]+":"+uqcnt[i]);
}
for (int i : arr) {
System.out.print(i+"\t");
}
System.out.println();
System.out.println();
//找出不重复的质数
for (int i = 0,t=0; i < ix; i++) {
if(uqarr[i]==1)continue;
t=uqarr[i];
boolean isPrime = true;
for (int j = 2; j <=Math.sqrt(t) ; j++) {
if(t%j==0){
isPrime=false;
break;
}
}
if(isPrime==true){
System.out.print(t+"\t");
}
}
System.out.println();
System.out.println();
//插入排序(降序排序)
for (int i = 1,j,t; i <= arr.length-1; i++) {
t=arr[i];
for ( j = i-1; j >=0 && arr[j]< t ; j--) {
arr[j+1]=arr[j];
}
arr[j+1] =t;
}
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
代码运行结果:
16 50 33 10 12 33 6 7 42 18 23 34 21 15 27 4 39 37 8 24 12 36 44 28 4 45 37 15 22 43 40 30 46 48 42 46 49 11 14 31 14 19 44 34 38 2 3 38 5 9 20 35 18 47 31 5 48 17 28 19 20 27 6 11 36 3 22 47 40 49 32 17 13 2 30 1 7 41 24 16 23 25 1 10 41 50 32 25 9 21 45 43 8 35 29 39 29 13 26 26
7 23 37 43 11 31 19 2 3 5 47 17 13 41 29
50 50 49 49 48 48 47 47 46 46 45 45 44 44 43 43 42 42 41 41 40 40 39 39 38 38 37 37 36 36 35 35 34 34 33 33 32 32 31 31 30 30 29 29 28 28 27 27 26 26 25 25 24 24 23 23 22 22 21 21 20 20 19 19 18 18 17 17 16 16 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
11、奇数偶数分离(二分法思想)
随机生成一个长度为20,取值1~100之内的整数数组,将其中奇偶数分离出来,奇左偶右?
import java.util.Random;
public class Practise100 {
public static void main(String[] args){
int[] arr = new int[20];
Random rand = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = 1 + rand.nextInt(100);
}
int begin = 0, end = arr.length - 1,t;
while (begin < end) {
if (arr[end] % 2 == 0) {
end--;
} else {
if (arr[begin]%2==1) {
begin++;
}else{
t=arr[begin];
arr[begin]=arr[end];
arr[end]=t;
}
}
}
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
代码运行结果:
35 27 85 85 45 15 67 35 87 79 95 74 22 68 100 28 40 32 28 66
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |