50道JAVA编程算法题(二)

【程序21】

题目:求1+2!+3!+...+20!的和

程序分析:此程序只是把累加变成了累乘。

public class  Prog21{

    public static void main(String[] args){

        long sum = 0;

        for(int i=0;i<20;i++)

  sum += factorial(i+1);

        System.out.println(sum);

    }

    //阶乘

    private static long factorial(int n){

        int mult = 1;

        for(int i=1;i

  mult *= i;

        return mult;

    }

}

【程序22】

题目:利用递归方法求5!。

程序分析:递归公式:fn=fn_1*4!

public class  Prog22{

    public static void main(String[] args){

        System.out.println(fact(10));

    }

    //递归求阶乘

    private static long fact(int n){

        if(n==1)

  return 1;

        else

  return fact(n-1)*n;

    }

}

【程序23】

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

public class  Prog23{

    public static void main(String[] args){

        System.out.println(getAge(5,2));

    }

    //求第m位同志的年龄

    private static int getAge(int m,int n){

        if(m==1)

  return 10;

        else

  return getAge(m-1,n)+n;      

    }

}

【程序24】

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

public class  Prog24{

    public static void main(String[] args){

        int n = Integer.parseInt(args[0]);

        int i = 0;

        int[] a = new int[5];

        do{

            a[i] = n%10;

  n /= 10;

  ++i;

        }while(n!=0);

        System.out.print("这是一个"+i+"位数,从个位起,各位数字依次为:");

        for(int j=0;j

  System.out.print(a[j]+" ");

    }

}

【程序25】

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

import  java.io.*;

public class  Prog25{

    public static void main(String[] args){

        int n = 0;

        System.out.print("请输入一个5位数:");

        BufferedReader bufin = new  BufferedReader(new InputStreamReader(System.in));

        try{

  n = Integer.parseInt(bufin.readLine());

        }catch(IOException e){

            e.printStackTrace();

        }finally{

            try{

  bufin.close();

            }catch(IOException e){

                e.printStackTrace();

            }

        }

        palin(n);

    }

    private static void palin(int n){

        int m = n;

        int[] a = new int[5];

        if(n<10000 || n>99999){

            System.out.println("输入的不是5位数!");

            return;

        }else{

  for(int i=0;i<5;i++){

  a[i] = n%10;

  n /= 10;

  }

  if(a[0]==a[4] && a[1]==a[3])

  System.out.println(m+"是一个回文数");

  else

  System.out.println(m+"不是回文数");

  }

   }

}

【程序26】

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

import  java.io.*;

public class  Prog26{

    public static void main(String[] args){

        String str = new String();

  BufferedReader bufIn = new BufferedReader(new InputStreamReader(System.in));

  System.out.print("请输入星期的英文单词前两至四个字母):");

  try{

  str = bufIn.readLine();

  }catch(IOException e){

  e.printStackTrace();

  }finally{

  try{

  bufIn.close();

  }catch(IOException e){

  e.printStackTrace();

  }

      }

  week(str);

    }

    private static void week(String str){

        int n = -1;

        if(str.trim().equalsIgnoreCase("Mo")  || str.trim().equalsIgnoreCase("Mon") ||  str.trim().equalsIgnoreCase("Mond"))

  n = 1;

        if(str.trim().equalsIgnoreCase("Tu")  || str.trim().equalsIgnoreCase("Tue") ||  str.trim().equalsIgnoreCase("Tues"))

  n = 2;

        if(str.trim().equalsIgnoreCase("We")  || str.trim().equalsIgnoreCase("Wed") ||  str.trim().equalsIgnoreCase("Wedn"))

  n = 3;

        if(str.trim().equalsIgnoreCase("Th")  || str.trim().equalsIgnoreCase("Thu") ||  str.trim().equalsIgnoreCase("Thur"))

  n = 4;

        if(str.trim().equalsIgnoreCase("Fr")  || str.trim().equalsIgnoreCase("Fri") ||  str.trim().equalsIgnoreCase("Frid"))

  n = 5;

        if(str.trim().equalsIgnoreCase("Sa")  || str.trim().equalsIgnoreCase("Sat") ||  str.trim().equalsIgnoreCase("Satu"))

  n = 2;

        if(str.trim().equalsIgnoreCase("Su")  || str.trim().equalsIgnoreCase("Sun") ||  str.trim().equalsIgnoreCase("Sund"))

  n = 0;

        switch(n){

            case 1:

  System.out.println("星期一");

  break;

            case 2:

  System.out.println("星期二");

  break;

            case 3:

  System.out.println("星期三");

  break;

            case 4:

  System.out.println("星期四");

  break;

            case 5:

  System.out.println("星期五");

  break;

            case 6:

  System.out.println("星期六");

  break;

            case 0:

  System.out.println("星期日");

  break;

            default:

  System.out.println("输入有误!");

  break;

        }

    }

}

【程序27】

题目:求100之内的素数

public class  Prog27{

    public static void main(String[] args){

        int n = 100;

        System.out.print(n+"以内的素数:");

        for(int i=2;i

            if(isPrime(i))

  System.out.print(i+" ");

        }

    }

    //求素数

    private static boolean isPrime(int n){

        boolean flag = true;

        for(int i=2;i

            if(n%i==0){

  flag = false;

  break;

            }

        return flag;

    }

}

【程序28】

题目:对10个数进行排序

程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。

public class  Prog28{

    public static void main(String[] args){

        int[] a = new  int[]{31,42,21,50,12,60,81,74,101,93};

        for(int i=0;i<10;i++)

            for(int j=0;j

                if(a[j]>a[j+1]){

                    int temp = a[j];

                    a[j] = a[j+1];

                    a[j+1] = temp;

                }

        for(int i=0;i

  System.out.print(a[i]+" ");

    }

}

【程序29】

题目:求一个3*3矩阵对角线元素之和

程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

public class  Prog29{

    public static void main(String[] args){

        int[][] a = new int[][]  {{100,2,3,},{4,5,6},{17,8,9}};

        matrSum(a);

    }

    private static void matrSum(int[][] a){

        int sum1 = 0;

        int sum2 = 0;

        for(int i=0;i

  for(int j=0;j

    if(i==j) sum1 += a[i][j];

    if(j==a.length-i-1) sum2 +=  a[i][j];

  }

        System.out.println("矩阵对角线之和分别是:"+sum1+"和"+sum2);

    }

}

【程序30】

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

import  java.util.Scanner;

public class  Prog30{

    public static void main(String[] args){

        int[] A = new  int[]{0,8,7,5,9,1,2,4,3,12};

        int[] B = sort(A);

        print(B);

        System.out.println();

        System.out.print("请输入10个数的数组:");

        Scanner scan = new Scanner(System.in);     

int a = scan.nextInt();

scan.close();

        int[] C = insert(a,B);

        print(C);

    }

    //选择排序

    private static int[] sort(int[] A){

        int[] B = new int[A.length];

        for(int i=0;i

            int min = A[i];

            for(int j=i+1;j

                if(min>A[j]){

                    int temp = min;

                    min = A[j];

                    A[j] = temp;

                }

                B[i] = min;

            }

        }

        B[A.length-1] = A[A.length-1];

        return B;

    }

    //打印

    private static void print(int[] A){

        for(int i=0;i

  System.out.print(A[i]+" ");

    }

    //插入数字

    private static int[] insert(int a,int[]  A){

        int[] B = new int[A.length+1];

        for(int i=A.length-1;i>0;i--)

  if(a>A[i]){

    B[i+1] = a;

  for(int j=0;j<=i;j++)

  B[j] = A[j];

  for(int k=i+2;k

  B[k] = A[k-1];

  break;

  }

        return B;

    }

}

【程序31】

题目:将一个数组逆序输出。

程序分析:用第一个与最后一个交换。

public class  Prog31{

    public static void main(String[] args){

        int[] A = new  int[]{1,2,3,4,5,6,7,8,9,};

        print(A);

        System.out.println();

        int[] B = reverse(A);

        print(B);

    }

    private static int[] reverse(int[] A){

        for(int i=0;i

            int temp = A[A.length-i-1];

            A[A.length-i-1] = A[i];

            A[i] = temp;

        }

        return A;

    }

    private static void print(int[] A){

        for(int i=0;i

  System.out.print(A[i]+" ");

    }

}

【程序32】

题目:取一个整数a从右端开始的4~7位。

程序分析:可以这样考虑:

(1)先使a右移4位。

(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)

(3)将上面二者进行&运算。

import  java.util.Scanner;

public class  Prog32{

    public static void main(String[] msg){

        //输入一个长整数

        Scanner scan = new Scanner(System.in);

        long l = scan.nextLong();

        scan.close();

        //以下截取字符

        String str = Long.toString(l);

        char[] ch = str.toCharArray();

        int n = ch.length;

        if(n<7)

  System.out.println("输入的数小于7位!");

        else

  System.out.println("截取的4~7位数字:"+ch[n-7]+ch[n-6]+ch[n-5]+ch[n-4]);

        }    

}

【程序33】

题目:打印出杨辉三角形(要求打印出10行如下图)

程序分析:

1

1 1

1 2 1

1 3 3 1

 1 4 6 4 1

1 5 10 10 5 1

public class  Prog33{

    public static void main(String[] args){

        int[][] n = new int[10][21];

        n[0][10] = 1;

        for(int i=1;i<10;i++)

  for(int j=10-i;j<10+i+1;j++)

  n[i][j] = n[i-1][j-1]+n[i-1][j+1];

        for(int i=0;i<10;i++){

            for(int j=0;j<21;j++){

                if(n[i][j]==0)

                  System.out.print("   ");

                else{

  if(n[i][j]<10)

    System.out.print("  "+n[i][j]);//空格为了美观需要

  else if(n[i][j]<100)

                  System.out.print("  "+n[i][j]);

                  else

                    System.out.print(n[i][j]);

  }

            }

            System.out.println();

        }

    }

}

【程序34】

题目:输入3个数a,b,c,按大小顺序输出。

程序分析:利用指针方法。

import  java.util.Scanner;

public class  Prog34{

    public static void main(String[] args){

        System.out.print("请输入3个数:");

        Scanner scan = new  Scanner(System.in).useDelimiter("\\s");

        int a = scan.nextInt();

        int b = scan.nextInt();

        int c = scan.nextInt();

        scan.close();

        if(a

            int t = a;

            a = b;

            b = t;

        }

        if(a

            int t = a;

            a = c;

            c = t;

        }

        if(b

            int t = b;

            b = c;

            c = t;

        }

        System.out.println(a+"  "+b+" "+c);

    }

}

【程序35】

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

import  java.util.Scanner;

public class  Prog35{

    public static void main(String[] args){

        System.out.print("请输入一组数:");

        Scanner scan = new  Scanner(System.in).useDelimiter("\\s");

        int[] a = new int[50];

        int m = 0;

        while(scan.hasNextInt()){

            a[m++] = scan.nextInt();

        }

        scan.close();

int[] b = new int[m];

        for(int i=0;i

  b[i] = a[i];

        for(int i=0;i

            for(int j=0;j

                if(b[j]

                    int temp = b[j];

                    b[j] = b[j+1];

                    b[j+1] = temp;

                }

        for(int i=0;i

  System.out.print(b[i]+" ");

    }

}

【程序36】

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

import  java.util.Scanner;

public class  Prog36{

    public static void main(String[] args){

        final int N = 10;

        System.out.print("请输入10个数的数组:");

        Scanner scan = new Scanner(System.in);

        int[] a = new int[N];

        for(int i=0;i

  a[i] = scan.nextInt();

        System.out.print("请输入一个小于10的数:");

        int m = scan.nextInt();

        scan.close();

        int[] b = new int[m];

        int[] c = new int[N-m];

        for(int i=0;i

  b[i] = a[i];

        for(int i=m,j=0;i

  c[j] = a[i];

        for(int i=0;i

  a[i] = c[i];

        for(int i=N-m,j=0;i

  a[i] = b[j];

        for(int i=0;i

  System.out.print(a[i]+" ");

    }

}

【程序37】

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

import  java.util.Scanner;

public class  Prog37{

    public static void main(String[] args){

        System.out.print("请输入一个整数:");

        Scanner scan = new Scanner(System.in);

        int n = scan.nextInt();

        scan.close();

        //定义数组变量标识某人是否还在圈内

        boolean[] isIn = new boolean[n];

        for(int i=0;i

  isIn[i] = true;

        //定义圈内人数、报数、索引

        int inCount = n;

        int countNum = 0;

        int index = 0;

        while(inCount>1){

            if(isIn[index]){

                countNum++;

                if(countNum==3){

                    countNum = 0;

                    isIn[index] = false;

                    inCount--;

                }

            }

            index++;

            if(index==n)

  index = 0;

        }

        for(int i=0;i

  if(isIn[i])

  System.out.println("留下的是:"+(i+1));

    }

}

【程序38】

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

import  java.util.Scanner;

public class  Prog38{

    public static void main(String[] args){

        System.out.print("请输入一串字符:");

        Scanner scan = new  Scanner(System.in).useDelimiter("\\n");

        String strIn = scan.next();

        scan.close();

        char[] ch = strIn.toCharArray();

        System.out.println(strIn+"共"+(ch.length-1)+"个字符");

    }

}

【程序39】

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

import  java.util.Scanner;

public class  Prog39{

    public static void main(String[] args){

        System.out.print("请输入一个整数:");

        Scanner scan = new Scanner(System.in);

        int n = scan.nextInt();

        scan.close();

        if(n%2==0)

  System.out.println("结果:"+even(n));

        else

  System.out.println("结果:"+odd(n));

    }

    //奇数

    static double odd(int n){

        double sum = 0;

        for(int i=1;i

            sum += 1.0/i;

        }

        return sum;

    }

    //偶数

    static double even(int n){

        double sum = 0;

        for(int i=2;i

            sum += 1.0/i;

        }

        return sum;

    }

}

【程序40】

题目:字符串排序。

public class  Prog40{

    public static void main(String[] args){

        String[] str =  {"abc","cad","m","fa","f"};

        for(int i=str.length-1;i>=1;i--){

            for(int j=0;j<=i-1;j++){

                if(str[j].compareTo(str[j+1])<0){

                    String temp = str[j];

                    str[j] = str[j+1];

                    str[j+1] = temp;

                }

            }

        }

        for(String subStr:str)

  System.out.print(subStr+" ");

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容