Java编程基本功训练题(1~10)

import java.util.Scanner;

/**
 * @author febis
 * @create 2016-10-03
 */
public class BasicKnowlenge {

    /*
    1、编写一个Java程序在屏幕上输出“Hello World!”。
     */
    public static String printHello(){
        return "Hello World";
    }
    /*
    方法二:直接打印,不返回参数
     */
    public static void printHello2(){
        System.out.println("Hello World");
    }

    /*
    2、编写一个Java程序,用if-else语句判断某年份是否为闰年。
          思路:闰年的情况:能被4整除并且能被100整除或者能被400整除
          步骤:用if-else判断,需要逻辑运算符
     */
    public static String ifRun(int year){

        if(year % 4 == 0 && year % 100 ==0 ||year % 400 == 0) {
            return "是闰年";
        }else{
            return "不是闰年";
        }
    }

    /*
    3、编写一个Java程序在屏幕上输出1!+2!+3!+……+10!的和。
         思路:首先考虑用哪种数据类型,使用for循环进行阶乘
         步骤:目测上述数字不超过int范围,先设变量存和,再设一个变量存储每个阶乘的值。
     */
    public  static int jieCheng(int max){
        int sum = 0;  // 因为作用域的原因,不能放在for循环里面
        for(int x = 1 ;x<=max;x++){
            int m = x;  //不能直接带入x进行运算
            for(int y = 1;y<x;y++){
                m*=y;
            }
            sum +=m;
        }
        return sum;
    }

    /*
    4、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到
    第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    思路:这是一个菲波拉契数列问题
    步骤:每一项等于前两项的和
     */
    public  static void fei(int month){
        int f1=1;  //表示上一月兔子数量
        int f2=1; //表示当月兔子的数量
        System.out.println("第一个月兔子总数为:"+ f2 +"对");
        System.out.println("第二个月兔子总数为:"+ f2 +"对");
        for(int x=3;x<=month;x++){
            int f = f2;  //当前月作为下次计算的前一个月
            f2 = f1+f2;
            f1 = f;
            System.out.println("第"+ x +" 个月兔子总数为:"+ f2 +"对");
        }
    }

    /*
    5、判断101-200之间有多少个素数,并输出所有素数。
    思路:素数:除了一个本身,不能被其他数整除
    步骤:从101~本身进行整除,设两个变量,一个计数一个判断,当然,可以进行优化以减少运算次数。
     */
    public static void numofSushu(){
        int num = 0 ; // 作为素数个数标识
        for(int x=101;x<=200;x+=2){  // x+=2 偶数肯定不行
            boolean boo = false; // 设置标识,如果是素数则为true
            for(int y=2;y<Math.sqrt(x);y++){  //只需要算到x的平方根就可以
                if(x%y==0){
                    boo = false;
                    break;
                }else {
                    boo = true;
                }
            }
            if(boo ==true){
                num+=1;
            }
        }
        System.out.println("101~200之间素数的个数为:"+ num);
    }

    /*
    6、打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
          例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
          思路:将各个数拆分平方计算求和
          步骤:先将三位数拆开再计算
     */
    public static void flower(){
        int a,b,c;
       for(int x=100;x<=999;x++){
          a = x/100;   //百位数
           b = x/10%10;    //十位数
           c = x%10;  //个位数
           if(a*a*a+b*b*b+c*c*c==x){
               System.out.print(x+" ");
           }
       }
        System.out.println();
    }

    /*
    7、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
    思路:每个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做分解质因数。
    步骤:(1)找给出的数的最小质数,如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
                (2)如果n > k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
                (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
     */
    public static void fenJie(int x){
        String str = null;   //作为分解因式后面的字符串
        int min = 2; // 设置最小的质数为2
        System.out.print(x + "=");
        while(min<=x){
            if(min == x){    //步骤1
                System.out.println(x);
                break;
            }else if(x%min == 0){   //步骤2
                System.out.print(min+ "*");
               x = x/min;
            }else{    //步骤3
                    min++;
            }
        }
    }

    /*
    8、利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,
          60-89分之间的用B表示,60分以下的用C表示。
          思路:使用if判断分数是否符合条件,再用switch判断属于哪一个分段
     */
    public static  void grade(int x){
        int y = x/10;
        if(x>=0 && x<=100) {
            switch (y) {
                case 9:case 10:
                    System.out.println("该同学分数为A");
                    break;
                case 6:
                case 7:
                case 8:
                    System.out.println("该同学分数为B");
                    break;
                default:
                    System.out.println("该同学分数为C");
                    break;
            }
        }else{
            System.out.println("分数不符合规范");
        }

    }

    //方法二:使用三元判断
    public static void grade2(int x){
        char live ;
        if(x>=0 && x<=100){
            live = x>90 ? 'A':x>60?'B':'C';
            System.out.println("该同学分数为"+live);
        }else{
            System.out.println("分数不符合规则");
        }
    }

    /*
    9、输入两个正整数m和n,求其最大公约数和最小公倍数。
    思路:在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,
                取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回较大的数,
                此数即为最大公约数,最小公倍数为两数之积除以最大公约数
     */
    public static int deff(int a, int b){

        if(a>b){    //将a转变成小的数,b为大的数
            int x = b;
            b=a;
            a=x;
        }
        while(a!=0){
            if(a ==b){
                return b;
            }else{
                int k  = b%a;
                b=a;
                a=k;
            }
        }
        return b;
    }

    /*
    10、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    思路:先接收一个字符串,然后将字符串的每一项放入一个字符数组,分开统计得出结果。使用循环嵌套
    步骤:先定个几个变量用于存储各字符的数量,接收字符,分解字符,判断字符。
     */
    public static void charType(String str){
        int digital = 0;
        int character = 0;
        int blank = 0;
        int other = 0;
        char[] ch = str.toCharArray();  //tocharArray()方法是将字符串分解
//        for(int x=0;x<ch.length;x++){
//            if(ch[x]>='0' && ch[x]<='9'){
//                digital++;
//            }else if (ch[x]>='A' && ch[x]<='z'){
//                        //因为大写与小写字符是相连的,所以不用:(ch[x]>='a' && ch[x]<='z')||(ch[x]>='A' && ch[x]<='Z')
//                        //大写编码在前,小写在后
//                character++;
//            }else if(ch[x] == ' '){
//                blank++;
//            }else {
//                other++;
//            }
//        }
        for(int x=0;x<ch.length;x++){
            //m是无效变量
            int m = ch[x]>='0' && ch[x]<='9' ? digital++:ch[x]>='A' && ch[x]<='z'?character++:ch[x] == ' '? blank++:other++;
        }
        System.out.println("英文字符个数为:" + character);
        System.out.println("数字字符个数为:" + digital);
        System.out.println("空格字符个数为:" + blank);
        System.out.println("其他字符个数为:" + other);
    }



    public static void main(String[] args){

        //1.
        System.out.println("第一题---------------------");
        String str = printHello();     //方法返回一个String字符串,需要建变量接收才能再打印
        System.out.println(str);
        printHello2();

        //2.
        System.out.println("第二题---------------------");
        int year = 2010;
        System.out.println(year + ifRun(year));

        //3.
        System.out.println("第三题---------------------");
        int cheng = jieCheng(4);
        System.out.println(cheng);

        //4.
        System.out.println("第四题---------------------");
        fei(10);

        //5.
        System.out.println("第五题---------------------");
        numofSushu();

        //6.
        System.out.println("第六题---------------------");
        flower();

        //7.
        System.out.println("第七题---------------------");
        System.out.print("请输入一个正整数:");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        fenJie(num);

        //8.
        System.out.println("第八题---------------------");
        System.out.print("方法1:请输入一个分数:");
        int fenshu = sc.nextInt();
        grade(fenshu);
        //方法2
        System.out.print("方法2:请输入一个分数:");
        int fenshu2 = sc.nextInt();
        grade2(fenshu2);

        //9.
        System.out.println("第九题---------------------");
        System.out.print("请输入两个个正整数:");
        int m = sc.nextInt();
        int n = sc.nextInt();
        int max = deff(m,n);
        int min  = m*n/max;
        System.out.println("两数最大公约数为:" +max);
        System.out.println("两数最小公倍数为:" +min);

        //10.
       System.out.println("第十题---------------------");
        System.out.println("请输入一个字符串:");
        String str2 = sc.nextLine();  //nextLine()方法接收空格
        charType(str2);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值