程序题练习---初级篇

来源:互联网 发布:js如何隐藏tr 编辑:程序博客网 时间:2024/06/04 06:52

方法肯定不是最优的,还希望能和大家交流探讨

一、初级篇

1.输入n,求1到n的和

public static int sumToN(int n){return (n==1)?1:(n+sumToN(n-1));}public static void main(String[] args) {System.out.println("请输入一位正整数:");Scanner scan = new Scanner(System.in);int i = scan.nextInt();System.out.println("1到"+i+"的和为:"+sumToN(i));}

2.输入n,求n以内3或者5的倍数的和

public static int sum3Or5Mul(int n){if(n>2){   return (n%3==0||n%5==0)?(n+sum3Or5Mul(n-1)):sum3Or5Mul(n-1);}else{return 0;}}public static void main(String[] args) {System.out.println("请输入一位整数:");Scanner scan = new Scanner(System.in);int i = scan.nextInt();System.out.println("1到"+i+"之间3或者5的倍数的和"+sum3Or5Mul(i));}

3.输入整数n,按40%概率输出1到n的和按60%的概率输出1到n的乘积

public static int productToN(int n){return n==1?1:n*productToN(n-1);}public static int sumToN(int n){return (n==1)?1:(n+sumToN(n-1));}public static void main(String[] args) {System.out.println("请输入一位整数:");Scanner scan = new Scanner(System.in);int i = scan.nextInt();Random rm = new Random();int index = rm.nextInt(10);if(index<4){System.out.println("1到"+i+"之间的和为:"+sumToN(i));}else{System.out.println("1到"+i+"之间的积为:"+productToN(i));}}

4.输入整数n,打印n*n的乘法口诀表(格式对齐)

//求整数的位数public  static int getNOfInt(int n){return Integer.toString(n).length();}public static void main(String[] args) {System.out.println("请输入一位整数:");Scanner scan = new Scanner(System.in);int n = scan.nextInt();System.out.println(n+"*"+n+"的乘法表为:");for(int i= 1;i <= n;i++){for(int j = 1;j <= i;j++){int a = getNOfInt(n);int b = getNOfInt(n*n); String fomat = "%1$"+a+"d"+"*"+"%2$"+a+"d"+"="+"%3$"+b+"d";String res = String.format(fomat, i,j,i*j);System.out.print(res+" ");}System.out.println();}}

5.游戏:程序随机生成0-99内的一个数字,由用户猜测,并提示用户输入是大是小,如果猜对输出总的猜测次数

//获取输入的数字public static int getInputNum(){Scanner scan = new Scanner(System.in);int i = scan.nextInt();if(i<0||i>99){throw new IllegalArgumentException ("输入错误,输入数据不是0-99整数!");}else{return i;}}//进行判断输入数字和所猜测数字的大小,Num是所猜测的数字,n是输入的数字,m是已经猜了的次数public static void printRes(int Num,int n,int m){if(n != Num){String res= n>Num?"您输入的数字大了":"您输入的数字小了";System.out.println(res);printRes(Num,getInputNum(),m+1);}else{System.out.println("您猜对了,共用了"+(m+1)+"次!");}}public static void main(String[] args) {System.out.println("猜数字游戏:请猜测出0-99的一个整数:");Random rm = new Random();int num = rm.nextInt(100);printRes(num, getInputNum(),0);}

6.输出接下来的20个闰年

//判断是闰年public static boolean isLeapYear(int year){return (year%4==0 && year%100!=0)||(year%400==0);}//打印最近的20个闰年public static void printLeapYears(int m){int i = 0;while(i<20){if(isLeapYear(m)){System.out.print(m+" ");i++;}m++;}}public static void main(String[] args) {System.out.println("最近的20个闰年分别为:");printLeapYears(2013);}

7.找出正整数n以内的全部素数

//寻找max以内的素数并输出public static void findPrime(int max){System.out.println(max+"以内的素数为:");int i=0; //用于计数if(max<1){throw new IllegalArgumentException("无");}else{System.out.print(String.format("%5d", 2));i++;for(int j=3;j<=max;j=j+2){boolean flag = true;for(int k=3;k<=(int)Math.sqrt(j);k=k+2){if(j%k==0){flag=false;}}if(flag){System.out.print(String.format("%5d", j));i++;if(i%10==0){System.out.println();}}}}System.out.println();System.out.println("共有:"+i+"个素数");}public static void main(String[] args) { double start = System.currentTimeMillis(); findPrime(10000); double end = System.currentTimeMillis(); System.out.println("所用时间:"+(end-start)+"毫秒");}

8. 写一个函数,返数组中最大的数。

//生成具有n个m以内随机整数的数组public static int[] creatArray(int n,int m){Random rm  = new Random();int[] array = new int[n];for(int i=0;i<n;i++){array[i]=rm.nextInt(m);}return array;}//获取数组中的最大元素public static int getMaxNum(int[] array){int max = array[0];for(int i=0;i<array.length;i++){max = max>array[i]?max:array[i];}return max;}public static void main(String[] args) { int[] array  = creatArray(20,100); System.out.println("原数组为:"); for(int i=0;i<array.length;i++){ System.out.print(array[i]+" ");  } System.out.println(); System.out.println("最大数为:"+getMaxNum(array));}原数组为:25 54 69 54 40 3 39 85 62 91 5 90 86 71 65 63 17 65 35 75 最大数为:91

9. 交替合并两个数组

// 写个函数交替合并两个数组public static char[] join(char a[],char b[]){int length = (a.length<b.length)?2*a.length:2*b.length; char [] array = new char[a.length+b.length];for(int i = 0;i<length/2;i++){array[2*i]= a[i];array[2*i+1] = b[i];}for(int j = length;j<(a.length+b.length);j++){array[j] = (a.length<b.length)?b[j-a.length]:a[j-b.length];}return array;}//输出数组public static void printArray(char[] array){for(int i=0;i<array.length;i++){System.out.print(array[i]+" ");}System.out.println();}public static void main(String[] args) {char[] a  = {'1','2','3'};char[] b  = {'a','b','c','d','e'};System.out.println("原数组为:");printArray(a);printArray(b);System.out.println("交替合并两个数组后:");printArray(join(a,b));}原数组为:1 2 3 a b c d e 交替合并两个数组后:1 a 2 b 3 c d e

10. 给定一个字符串数组并按下面表示打印出来,一行一个打印在矩形框中

如["Hello","World", "in", "a", "frame"] 打印的结果是:

*********

* Hello *

* World *

* in        *

* a         *

* frame *

*********

//获取字符串数组最长元素的长度public static int getMaxLength(String[] strArray){int length = strArray[0].length();for(int i = 0;i<strArray.length;i++){length= strArray[i].length()>length?strArray[i].length():length;}return length;}//输出一行n个星号public static void printNstar(int n){for(int i=0;i<n;i++){System.out.print("*");}System.out.println();}//按格式输出字符串数组public static void printStrArray(String[] strArray){int maxLength = getMaxLength(strArray);printNstar(maxLength+2);for(int i = 0;i<strArray.length;i++){System.out.println("*"+String.format("%-"+maxLength+"s"+"*", strArray[i]));}printNstar(maxLength+2);} public static void main(String[] args) {String[] strArray = {"Hello","world","in","a","frame"};printStrArray(strArray);}

11. 写个函数,返回指定数的各位数字的列表。

//给一个整数,返回各位数字的数组public static int[] getNumArray(int n){int[] array = new int[getNOfInt(n)]; //getNOfInt参见初级篇第4题int i = 0;int temp = n;while(temp!=0){array[i++]=temp%10;temp = temp/10;}return array;}public static void main(String[] args) {int[] array = getNumArray(1258976);for(int i=array.length-1;i>=0;i--){System.out.print(array[i]+" ");}}

12. 实现下面的排序算法:选择排序,插入排序,归并排序,快速排序,冒泡排序

选择排序

//选择排序public static int[] selectSort(int[] array){for(int i=0;i<array.length-1;i++){for(int j=i+1;j<array.length;j++){if(array[i]>array[j]){int temp = array[i];array[i] = array[j];array[j] =temp;}}}return array;}public static void main(String[] args) {int[] array = creatArray(100000,10000);//参见第初级8题double start = System.currentTimeMillis();selectSort(array);double end  = System.currentTimeMillis();System.out.println("所用时间为:"+(end-start)+"毫秒!");}所用时间为:14015.0毫秒!

插入排序

//插入排序public static int[] insertSort(int[] array){int length = array.length;for(int i=1;i<length;i++){ //从第二个元素起依次将元素插入前面已经排好序的部分数组中int temp = array[i];int j;for(j=i;j>0&&temp<array[j-1];j--){//如果比前一个数小array[j]=array[j-1]; //前一个数往后移}array[j]=temp; //将此数放在前一个数的位子上}return array;}public static void main(String[] args) {int[] array = creatArray(100000,10000);//参见第初级8题double start = System.currentTimeMillis();insertSort(array);double end  = System.currentTimeMillis();System.out.println("所用时间为:"+(end-start)+"毫秒!");}所用时间为:5157.0毫秒!

归并排序

//归并排序:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列public static int[] mergeTwoArray(int[] leftArray ,int[] rightArray){int[] newArray = new int[leftArray.length+rightArray.length];int index=0,i,j;for(i=0,j=0;i<leftArray.length&&j<rightArray.length;index++){ if(leftArray[i]<rightArray[j]){ newArray[index] = leftArray[i++]; }else{ newArray[index] = rightArray[j++]; }}for(;i<leftArray.length;i++){newArray[index++]=leftArray[i];}for(;j<rightArray.length;j++){newArray[index++]=rightArray[j];}return newArray;}public static int[] mergeSort(int[] array){if(array.length==1){return array;}else{int[] leftArray = new int[array.length/2];int[] rightArray = new int[array.length-array.length/2];int center = array.length/2;for(int i=0;i<leftArray.length;i++){leftArray[i]=array[i];}for(int j=0,k=center;j<rightArray.length;j++,k++){rightArray[j]= array[k];}int[] sortedLeftArray = mergeSort(leftArray);int[] sortedrightArray = mergeSort(rightArray);return mergeTwoArray(sortedLeftArray,sortedrightArray);}}public static void main(String[] args) {int[] array = creatArray(100000,10000);//参见第初级8题double start = System.currentTimeMillis();mergeSort(array);double end  = System.currentTimeMillis();System.out.println("所用时间为:"+(end-start)+"毫秒!");}所用时间为:31.0毫秒!

快速排序

//以数组最后一个元素作为主元将数组进行划分,使得数组的左边元素都比主元小,右边的都比主元大public static int partition(int[] array,int start,int end){int key = array[end];int i = start; //主要是用于依次存放比主元小的元素int j = start; //用于遍历数组寻找比主元小的元素for(;j<end;j++){ //将小于key的往前放if(array[j]<key){int temp = array[i];array[i] = array[j];array[j] = temp;i++;}}int flag = array[i];//将key放到划分位置array[i] = key;array[end] = flag;return i; //返回划分的位置}//快速排序public static int[] quickSort(int[] array,int start,int end){if(start>=end){return array;}else{int index  = partition(array,start,end);quickSort(array,start,index-1);quickSort(array,index+1,end);return array;}}public static void main(String[] args) {int[] array = creatArray(100000,10000);//参见第初级8题double start = System.currentTimeMillis();quickSort(array,0,array.length-1);double end  = System.currentTimeMillis();System.out.println("所用时间为:"+(end-start)+"毫秒!");}所用时间为:15.0毫秒!

冒泡排序

//冒泡排序public static int[] bubbleSort(int [] array){//每次排序将一个数字可以按序对位,所以要经过array.length-1次排序for(int i=0;i<array.length-1;i++){for(int j=array.length-1;j>i;j--){ //从后往前查,小于前面的数就交换,保证小的数往前放if(array[j]<array[j-1]){int temp = array[j-1]; array[j-1] = array[j]; array[j] =temp;}}}return array;}public static void main(String[] args) {int[] array = creatArray(100000,10000);//参见第初级8题double start = System.currentTimeMillis();bubbleSort(array);double end  = System.currentTimeMillis();System.out.println("所用时间为:"+(end-start)+"毫秒!");}所用时间为:21078.0毫秒!






0 0
原创粉丝点击