您的位置:首页 > 编程语言 > Java开发

JAVA基础编程50题(1-3题)详解

2015-03-19 15:39 706 查看
一、题目描述

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

程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... ,该题其实就是斐波那契数列的一种。

2、判断m-n之间有多少个素数,并输出所有素数。

程序分析:判断素数的方法:用一个数n分别去除2到sqrt(n),这里是Math自带的函数sqrt()求该数的平方根,如果能被整除,则表明此数不是素数,反之是素数。

3、打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。

例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位,然后判断是否满足各位数字立方和等于该数本身。

二、JAVA源代码

1、程序1

package tong.yue.hong;

import java.util.Scanner;

import javax.xml.transform.Templates;

/**
* 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
总之,除了第一个和第二个月兔子数量为1,其他月份是前两个月份兔子对数之和。
* @author tong
*
*/
public class Fibonacci {

public static void main(String[] args) {
System.out.println("请输入第几个月:");
Scanner scanner = new Scanner(System.in);
String month = scanner.nextLine();
diedai(Integer.parseInt(month));
digui(Integer.parseInt(month));
System.out.println("第"+month+"个月有兔子"+digui(Integer.parseInt(month))+"对");

}

/**
* 使用递归的方法求该数列,源代码简单,但是效率比较低,内存消耗大
* @param parseInt
* @return
*/
private static int digui(int parseInt) {
if(parseInt==1||parseInt==2){
return 1;
}else{
return digui(parseInt-1)+digui(parseInt-2);
}

}
/**
* 使用普通的方法,根据该数列的特性,除了第一个和第二个月兔子数量为1,其他月份是前两个月份兔子对数之和。
* @param parseInt
*/
private static void diedai(int parseInt) {
int first = 1;
int second = 1;
int temp = 0;
for (int i = 3; i <=parseInt; i++) {
temp = first;
first = second;
second = temp+second;
System.out.println("第"+i+"个月有兔子"+second+"对");

}
}

}


2、程序二

package tong.yue.hong;

import java.util.Scanner;

/*
* 题目:判断m-n之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
*/
public class Sushu {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字下限:");
int low = scanner.nextInt();
System.out.println("请输入数字上限:");
int high = scanner.nextInt();
if (low>high) {
System.out.println("您输入的数据有误,请重新输入!");
System.out.println("请输入数字下限:");
low = scanner.nextInt();
System.out.println("请输入数字上限:");
high = scanner.nextInt();
}
System.out.println(low+"-"+high+"之间的所有素数:");
int count = 0;
for (int i = low; i <= high; i++) {
if(isPrime(i)){
count ++;
System.out.print(i+" ");
//每输出10个素数就换行,便于观察
if(count%10==0){
System.out.println();
}
}
}
System.out.println("\n总共"+count+"个素数");

}
/**
* 该方法用来判断一个数是否为素数,判断条件是将该数除以从2开始到sqrt(该数),只要有一个能整除就不是素数,所有数都不能整除即素数
* @param i
* @return
*/
private static boolean isPrime(int i) {
if (i==1) {
return false;
}
for (int j = 2; j < Math.sqrt(i); j++) {
if(i%j==0){
return false;
}
}
return true;
}

}


3、程序3

package tong.yue.hong;
/**
* 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
* @author Administrator
* */
public class Shuixianhua {

public static void main(String[] args) {
System.out.println("100-999之间的水仙花数:");
//使用isShuixianhua()方法
for (int i = 100; i < 1000; i++) {
if(isShuixianhua(i)){
System.out.print(i+" ");
}
}
System.out.println("\n100-999之间的水仙花数:");
//使用isLotus()方法
for (int i = 100; i < 1000; i++) {
if(isLotus(i)){
System.out.print(i+" ");
}
}

}
/**
* 这里调用java自带的pow()方法求一个数的3次方
* @param i
* @return
*/
private static boolean isShuixianhua(int i) {
//获取个位:i%10,获取十位:i/10%10,获取百位:i/100
int sum = (int)(Math.pow(i%10, 3)+Math.pow(i/10%10, 3)+Math.pow(i/100, 3));
if (i==sum) {
return true;
}
return false;
}

/**
* 这里根据各位的数据关系将每个位上的数字取出并判断
* @param num
* @return
*/
private static boolean isLotus(int num){
int m = 0;
int n = num;
int sum = 0;
//获取百位
m = n/100;
//源数据减去百位数乘以100就剩下十位和个位
n -= m*100;
//百位数求立方
sum = m*m*m;
//获取十位
m = n/10;
//数据减去十位的部分就剩下个位的数据
n -= m*10;
//判断各位数字立方和等于该数本身
sum += m*m*m + n*n*n;
if(sum==num)
return true;
else
return false;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息