java逻辑编程题

以下程序分析是老师给出的提示,解答思路是自己的思考

1、题目:有一对兔子,从出生后第三个月起每个月都升一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少

解答思路:兔子状态分为newBorn(新生),oneM(一个月之后),adult(成年),这里分别对应一、二、三个月

                    第一个月总数为1对,考虑接下来的几个月,变化情况为newBorn->oneM,oneM->adult,而adult会产生newBorn,有几只adult就会产生几只newBorn

                    这里为了避免赋值出现问题,我们把表达式顺序倒过来,否则newBorn->oneM->adult,他们的值都一样了。

                    兔子的总数=原总数+新生数

代码:

import java.util.*;
public class Rabbit{
    public static void main(String[]args){
    int sum=1;
    int adult=0;
    int newBorn=1;
    int oneM=0;    
    System.out.print("how many month later:");
    Scanner x=new Scanner(System.in);
    int time=x.nextInt();
    System.out.println("最初兔子总数为:"+sum+"对");
    for(int t=1;t<=time;t++){
        adult=adult+oneM;
        //System.out.println("adult="+adult);        
        oneM=newBorn;
        //System.out.println("oneM="+oneM);
        newBorn=adult;
        //System.out.println("newBorn"+newBorn);
        sum=sum+newBorn;
        System.out.println(t+"月之后,兔子总数为:"+sum+"对");
        }
    }
}

2.题目:判断101-200之间有多少个素数,并输出所有素数。

程序分析:判断素数的方法:用一个数分别去除2sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。  

注:这里为什么是2到sqrt(这个数),因为如果这个数==n*n,如果不能被小于n的数整除,那么肯定也不能被大于n的数整除,因为如果这个数用两个数相乘表示,肯定有一个大于n,一个小于n

代码:

import java.util.*;
//导入使用sqrt的包
import static java.lang.Math.*;
public class Prime{
    public static void main(String[] args){
        //局部变量一定要注意它的作用域
        ArrayList<Integer>list=new ArrayList<Integer>();        
        for(int target=101;target<201;target++){

           //这里的j,用boolen值更好

            int i=2,j=0;
            int sq=(int)sqrt(target);
            for(i=2;i<sq;i++){

                //这里是target对i取余,不是sq

                if(target%i==0){
                j=1;
                break;
                }
            }
            if(j!=1){
                list.add(target);
            }
        }
        for(int m=0;m<list.size();m++){
            System.out.print(list.get(m)+" ");
        }
    }
}

3.题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。

解题思路:求出百位、十位、个位是多少,分别平方后与原数比较

代码:

import java.lang.Math.*;
public class Narcissistic{
    public static void main(String [] args){
        for(int num=100;num<1000;num++){
            int hund=num/100;
            int ten=(num%100)/10;
            int unit=num%10;
            if(Math.pow(hund,3)+Math.pow(ten,3)+Math.pow(unit,3)==num){
                System.out.print(num+" ");
            }
        }
    }
}

4.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:   
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。   
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。   
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 

易错点:1)list的使用方法

              2)while循环中k的增加

              3)容易忘记list添加完k值之后需要添加n

              4)list.get(),括号中数要小于list的长度,因为长度是从1开始,而list从0开始

代码:
import java.util.*;

public class Factor{
    public static void main(String[]args){
        System.out.print("请输入需要分解质因数的数:");
        Scanner x=new Scanner(System.in);
        int n=x.nextInt();
        int k=2;
        ArrayList<Integer> factor=new ArrayList<Integer>();
        while(k!=n){
            if(n%k==0){
                n=n/k;
                factor.add(k);
            }else k++;
        }
        factor.add(n);
        int length=factor.size();
        System.out.print("此数的因质数为:");
        for(int i=0;i<(length-1);i++){
        System.out.print(factor.get(i)+"*");
        }
        System.out.print(factor.get(length-1));

    }
}

5.题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。                

import java.util.*;
public class Grade {
    public static void main(String[] args) {
    int x;
    char grade;
    Scanner s = new Scanner(System.in);
    System.out.print( "请输入一个成绩: ");
    x = s.nextInt();

    //三元运算符    (条件表达式)?表达式1:表达式2

    //这里是(条件表达式)?表达式1:(条件表达式)?表达式2:表达式3————嵌套的三元运算符

   grade = x >= 90 ? 'A' : x >= 60 ? 'B':'C';
    System.out.println("等级为:"+grade);
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值