JAVA循环结构经典题目分析

    科技2022-08-09  91

    1.猜数字小游戏:随机生成一个1~10000以内的随机数,控制台输入数值一直到输入数值为该随机数为止。 每次猜完后要给出提示大了还是小了,猜中后输出猜的次数。

    int a=rand.nextInt(10000)+1; int guess=0,b; do{ b=input.nextInt(); System.out.print(b>a?"大了":b<a?"小了":"猜中了"+"\t"); guess++; }while(b!=a); System.out.println("猜的次数是"+guess);

    结果运行如下 2.输出1~1000以内的质数及其个数

    int[]arr=new int[500]; arr[0]=2; int count=1; for (int i = 3; i <=1000 ; i+=2) { boolean isPrime=true; for (int j=0; arr[j] <= Math.sqrt(i);j++ ) { if (i % arr[j] == 0) { isPrime = false;break; } } if (isPrime) arr[count++] = i; } System.out.println("1~1000的质数个数是"+count); for (int i = 0; i <count ; i++) { System.out.print(arr[i] + "\t"); if ((i + 1) % 14 == 0) System.out.println(); }

    3.随机生成30个1~30之内的整数,统计出不重复的数值和 其重复的次数

    int[] arr=new int[30]; int[] unique=new int[30]; int[] count=new int[30]; arr[0]=unique[0]=rand.nextInt(30)+1; count[0]=1; int k=1; for (int i = 1,j; i <30 ; i++) { arr[i]=rand.nextInt(30)+1; for ( j = 0; j <k ; j++) { if( arr[i]==unique[j]){ count[j]++; break; } } if(j==k){ unique[k]= arr[i]; count[k++]=1; } } System.out.println("不重复的数值有"+k+"个"); for (int i = 0; i <k ; i++) { System.out.println(unique[i]+":"+count[i]); }

    4.综合题:创建长度为15,取值范围1~31之间的随机数组,输出数组。 将其从小到大排序,输出数组 随机生成一个1~31的数,检索该值是否存在于排序后数组中,如果在, 输出其下标(二分法)

    int[]arr=new int[15]; arr[0]=rand.nextInt(31)+1; int k=1; int t=0; for (int j; k < arr.length;) { int num=rand.nextInt(31)+1; for ( j = 0; j <k ; j++) { if(num==arr[j])break; } if(j==k)arr[k++]=num; } for (int i : arr) { System.out.print(i+"\t"); } System.out.println(); //输出不重复的随机数组 final int U=10; int[][]bucket=new int[U][arr.length]; int[]ixs =new int[U]; for(int i=1;;i*=10){ int count=0; for ( int j = 0; j < arr.length; j++) { count=(t=arr[j]/i)>=1?++count:count; bucket[t=t%U][ixs[t]++]=arr[j]; } if(count==0)break; for (int j = 0,ix=0; j < bucket.length; j++) { for ( k = 0; k <ixs[j]; k++) { arr[ix++]=bucket[j][k]; } } for (int j = 0; j < ixs.length; j++) { ixs[j]=0; } } for (int i : arr) { System.out.print(i+"\t"); } System.out.println();//输出排序后数组 int num=rand.nextInt(31)+1; System.out.print("随机生成一个1~31之间的数值:"); System.out.println(num); int begin=0,end=arr.length-1,ix=-1; int mid=(begin+end)/2; while(begin<=end){ if(arr[mid]>num)end=mid-1; else{ if(arr[mid]<num)begin=mid+1; else{ix=mid;break;} } mid=(begin+end)/2; } System.out.println(ix>-1?"在数组中,下标是"+ix:"不在数组中");

    5. 五种排序

    //冒泡排序 int arr[]={9,10,12,6,8,11,9,6,7,1,25,23,3,45,1,13,21}; for (int i : arr) System.out.print(i+" "); System.out.println(); for (int i = 0,t; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if (arr[j]>arr[j+1]) { t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } } for (int i : arr) System.out.print(i+" "); //选择排序 int arr[]={9,10,12,6,8,11,9,6,7,1,25,23,3,45,1,13,21}; for (int i : arr) System.out.print(i+" "); System.out.println(); for (int i = 0; i < arr.length-1; i++) { int begin=0,end=arr.length-1-i,t=arr[begin]; for (int j = 1; j <=end; j++) { if(t<arr[j]) begin=j; } if(begin!=end){ t=arr[begin]; arr[begin]=arr[end]; arr[end]=t; } } for (int i : arr) System.out.print(i+" "); //插入排序 int arr[]={9,10,12,6,8,11,9,6,7,1,25,23,3,45,1,13,21}; for (int i : arr) System.out.print(i+" "); System.out.println(); for (int i = 1,t,j; i < arr.length; i++) { if(arr[i-1]<arr[i])continue; 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+" "); //希尔排序 int arr[]={9,10,12,6,8,11,9,6,7,1,25,23,3,45,1,13,21}; for (int i : arr) System.out.print(i+" "); System.out.println(); int step=arr.length,t; while((step=step/2)>=2){ for (int i = 0; i+step < arr.length; i++) { if(arr[i]>arr[i+step]){ t=arr[i]; arr[i]=arr[i+step]; arr[i+step]=t; } } } for (int i : arr) System.out.print(i+" "); System.out.println(); for (int i = 1,j; i < arr.length; i++) { if(arr[i-1]<arr[i])continue; 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+" "); //桶排序 int arr[]={9,10,12,6,8,11,9,6,7,1,25,23,3,45,1,13,21}; for (int i : arr) System.out.print(i+" "); System.out.println(); final int U=10; int[][]bucket=new int[U][arr.length]; int[]ixs=new int[U]; int t,count; for( int i=1;;i*=10){ count=0; for (int j = 0; j < arr.length; j++) { count=(t=arr[j]/i)>=1?++count:count; bucket[t=t%U][ixs[t]++]=arr[j]; } if(count==0)break; for (int j = 0,ix=0; j < bucket.length; j++) { for (int k = 0; k < ixs[j]; k++) { arr[ix++]=bucket[j][k]; } } for (int j = 0; j < ixs.length; j++) { ixs[j]=0; } } for (int i : arr) System.out.print(i+" ");

    运行结果 // 6.分离奇数偶数

    int[] arr=new int[30]; for (int i = 0; i <30 ; i++) { arr[i]=rand.nextInt(100)+1; System.out.print(arr[i]+"\t"); } System.out.println(); int[]ixs={0,arr.length-1}; int t; while(ixs[0]<ixs[1]){ while(ixs[0]<ixs[1]&&arr[ixs[0]]%2==1)ixs[0]++; while(ixs[0]<ixs[1]&&arr[ixs[1]]%2==0)ixs[1]--; if(ixs[0]<ixs[1]){ t=arr[ixs[0]]; arr[ixs[0]]=arr[ixs[1]]; arr[ixs[1]]=t; } } for (int i : arr) System.out.print(i+"\t");

    7.求最大分差与最小分差

    int[] arr=new int[30]; for (int i = 0; i <30 ; i++) { arr[i]=rand.nextInt(100)+1; System.out.print(arr[i]+"\t"); } System.out.println(); final int U=10; int[][]bucket=new int[U][arr.length]; int[]ixs=new int[U]; int t; for(int i=1,count;;i*=10){ count=0; for (int j = 0; j < arr.length; j++) { count=(t=arr[j]/i)>=1?++count:count; bucket[t=t%U][ixs[t]++]=arr[j]; } if(count==0)break; for (int j = 0,ix=0; j < bucket.length; j++) { for (int k = 0; k <ixs[j] ; k++) { arr[ix++]=bucket[j][k]; } } for (int j = 0; j < ixs.length; j++) { ixs[j]=0; } } for (int i : arr) { System.out.print(i+"\t"); } System.out.println(); int max=arr[arr.length-1]-arr[0]; int min=arr[arr.length-1]-arr[arr.length-2]; for(int i=arr.length-2;i>=1;i--){ min=min<arr[i]-arr[i-1]?min:arr[i]-arr[i-1]; } System.out.print(MessageFormat.format("最大分差是{0},最小分差是{1}",max,min));

    .随机数模拟本班25个人的java成绩(整数0~100分),找到前三名成绩(两种情况) int[] arr = {100,100,100,99,98,98,97,96}; for (int i : arr) { System.out.print(i+"\t"); } System.out.println(); // 第一种情况:只输出最大的三个不同成绩 int count=1; int t=arr[0]; System.out.print(t+"\t"); for(int i=1;i<arr.length&&count<3;i++){ if(arr[i]!=t){ t=arr[i]; System.out.print(t+"\t"); count++; } }

    int[] arr = {100,100,100,99,98,98,97,96}; for (int i : arr) { System.out.print(i+"\t"); } System.out.println(); //第二种情况:输出所有前三名的成绩 int count=1; int t=arr[0]; System.out.print(t+"\t"); for(int i=1;i<arr.length;i++) { if((arr[i]!=t)&&(t=arr[i])!=-1&&++count>3) break; System.out.print(arr[i]+"\t"); }

    9 空心漏斗

    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 <=1+2*Math.abs(i) ; j++) { if(i==-4||i==4||j==1||j==1+2*Math.abs(i)) System.out.print("*"); else System.out.print(" "); } System.out.println();

    10.空心菱形

    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++) { if(i==-4||i==4||j==1||j==9-2*Math.abs(i)) System.out.print("*"); else System.out.print(" "); } System.out.println(); }

    11. 随机生成1~100之间的随机数30个,求最大值?并确定该值是否重复?若存在重复,重复多少次?

    int[]arr=new int[30]; int count=0,max=0; for (int i = 0; i <30 ; i++) { arr[i]=rand.nextInt(30)+1; System.out.print(arr[i]+"\t"); if(max==arr[i])count++; if(max<arr[i]){ max=arr[i]; count=0; } } System.out.println("最大值是"+max+(count==0?"不重复":"重复了"+count+"次"));

    12.年历

    System.out.print("请输入年份:"); int year=input.nextInt(); int sum=1,lastday=0; for (int i = 1900; i <year ; i++) sum+=(i%4==0&&i%100!=0)||i%400==0?366:365; for (int month = 1; month <=12 ; month++) { System.out.println(); System.out.println(month+"月月历"); System.out.print("日\t一\t二\t三\t四\t五\t六"); System.out.println(); switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: lastday=31;break; case 4: case 6: case 9: case 11: lastday=30;break; case 2: lastday=(year%4==0&&year%100!=0)||year%400==0?29:28;break; } for (int j = 1; j <=sum%7 ; j++) System.out.print("\t"); for (int j = 1; j <=lastday ; j++) { if(sum%7==6) System.out.print(j+"\n"); else System.out.print(j+"\t"); sum++; } }

    仅给出部分月份结果 13.假设第一位为中位数,排序

    int[] arr=new int[30]; for (int i = 0; i <30 ; i++) { arr[i]=rand.nextInt(100)+1; System.out.print(arr[i]+"\t"); } System.out.println(); int begin=0,end=arr.length-1,t; int mid=arr[begin]; while(begin<end){ while(begin<end&&arr[end]>=mid)end--; while(begin<end&&arr[begin]<=mid)begin++; if(begin<end){ t=arr[begin]; arr[begin]=arr[end]; arr[end]=t; } } if(begin!=0){ t=arr[0]; arr[0]=arr[begin]; arr[begin]=t; } for (int i : arr) System.out.print(i+"\t");

    14.给定两个日期,求相隔天数

    System.out.println("请输入初始年份:"); int year1=input.nextInt(); System.out.println("请输入初始月份:"); int month1=input.nextInt(); System.out.println("请输入初始日期:"); int day1=input.nextInt(); System.out.println("请输入结束年份:"); int year2=input.nextInt(); System.out.println("请输入结束月份:"); int month2=input.nextInt(); System.out.println("请输入结束日期:"); int day2=input.nextInt(); int sum=0,t,day; for (int i = year1+1; i <year2 ; i++) sum+=(i%4==0&&i%100!=0)||i%400==0?366:365; if(year1!=year2)t=12; else t=month2-1; for (int i = month1,year=year1; i <=t ; i++) { switch(i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: sum+=31;break; case 4: case 6: case 9: case 11: sum+=30;break; case 2: sum+=(year%4==0&&year%100!=0)||year%400==0?29:28;break; } if(i==12){ i=0; t=month2-1; year=year2; continue; } } day=sum-day1+day2; System.out.println("两个日期相差"+day+"天");

    15.给定一个初始日期和一个天数,求结束日期

    System.out.println("请输入初始年份:"); int year=input.nextInt(); System.out.println("请输入初始月份:"); int month=input.nextInt(); System.out.println("请输入初始日期:"); int day=input.nextInt(); System.out.println("请输入天数:"); int num=input.nextInt(); int sum=0,monthday=0; for (int i = month,j; i <=12&&sum<day+num ; i++) { switch(i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: monthday=31; sum+=monthday; if(sum<day+num){month++;} break; case 4: case 6: case 9: case 11: monthday=30; sum+=monthday; if(sum<day+num){month++;} break; case 2: monthday=(year%4==0&&year%100!=0)||year%400==0?29:28; sum+=monthday; if(sum<day+num){month++;} break; } if (i==12&&sum<day+num){ i=0; year++; month=1; continue; } } day=day+num-(sum-monthday); System.out.println(MessageFormat.format("{0}年{1}月{2}日",year,month,day));

    16.输出1~1000内能被3整除同时含有5的数字

    int count=0; for (int i = 0; i <1000 ; i++) { if(i%3==0&&(""+i).indexOf('5')!=-1){ System.out.print(i+"\t"); if(++count%10==0){ System.out.println(); } } }

    Processed: 0.011, SQL: 8