【程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2~sqrt(n)或者2~n/2,常用2~n/2,因为一个数的一半的平方大于其本身是从5开始的,解方程:n/2的平方>n .如果能被整除,
则表明此数不是素数,反之是素数。
【程序3】
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
【程序4】Explode.java
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)运用两层循环。
(2)外循环得到2~n之间的所有质数,内循环将n循环除以质数,知道不能整除。
(3)要是内循环n等于1了就说明n被完全整除了。
【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
3.最小公倍数等于两数之积除以最大公约数
【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用循环,使用Map存储数据.其实完全可以使用4个变量来解决,这边舍近求远复习下Map啦
【程序8】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
【程序9】
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
【程序10】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2~sqrt(n)或者2~n/2,常用2~n/2,因为一个数的一半的平方大于其本身是从5开始的,解方程:n/2的平方>n .如果能被整除,
则表明此数不是素数,反之是素数。
【程序3】
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
【程序4】Explode.java
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)运用两层循环。
(2)外循环得到2~n之间的所有质数,内循环将n循环除以质数,知道不能整除。
(3)要是内循环n等于1了就说明n被完全整除了。
【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
3.最小公倍数等于两数之积除以最大公约数
【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用循环,使用Map存储数据.其实完全可以使用4个变量来解决,这边舍近求远复习下Map啦
【程序8】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
【程序9】
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
【程序10】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
按顺序对应各个题:
package javaimprove001;
import java.util.Scanner;
/*
* 【程序1】 TestRabbit.java
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
问题分析:从以上数列我们不难得出递归规律为:a(n)=a(n-1)+a(n-2),这里变成一个递归问题。
*/
public class Rabbit {
public int RabbitTotal(int month)
{
if(month==0||month==1)
{
return 1;
}
return RabbitTotal(month-1)+RabbitTotal(month-2);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入您需要了解的兔子数量的月份:");
Scanner in=new Scanner(System.in);
int month=in.nextInt();
Rabbit rabbit=new Rabbit();
System.out.printf("兔子的数量为:%d 对",rabbit.RabbitTotal(month));
}
}
package javaimprove002;
/*
* 【程序2】 FindPrimeNumber.java
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2~sqrt(n)或者2~n/2,常用2~n/2,因为一个数的一半的平方大于其本身是从5开始的,解方程:n/2的平方>n .如果能被整除,
则表明此数不是素数,反之是素数。
*/
public class FindPrimeNumber {
public boolean isPrime(int number)
{
for(int n=2;n<=number/2;n++)
{
if(number%n==0)
return false;
}
return true;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FindPrimeNumber find=new FindPrimeNumber();
for(int begin=101;begin<200;begin++)
{
if(find.isPrime(begin)==true)
{
System.out.printf("%d ",begin);
}
}
}
}
package javaimprove003;
/*
* 【程序3】FindDaffodilNumber.java
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
问题分析::
*/
public class DaffodilNumber {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一种方法从三位数求出个十百位数判断是否相等
for(int number=100;number<1000;number++)
{
int high=number/100;//百位
int mid=number%100/10;//十位
int low=number%10;//个位
if(number==Math.pow(high, 3)+Math.pow(mid, 3)+Math.pow(low, 3))
System.out.printf("%d ",number);
}
//第二种方法构成一个三位数,并且判断是否符合条件
for(int high=1;high<10;high++)
{
for(int mid=0;mid<10;mid++)
{
for(int low=0;low<10;low++)
{
int d=100*high+10*mid+low;
if(d==Math.pow(high, 3)+Math.pow(mid, 3)+Math.pow(low, 3))
System.out.printf("%d ",d);
}
}
}
}
}
package javaimprove004;
import java.util.Scanner;
/*
* 【程序4】Explode.java
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
问题分析:分解要求是分解到不能再分解下去,因此分解出来的因数应该都是质数 。
如果分解出来的因数部位质数,那么还要再进行分解,因此这里额可以看成是一个递归。
*/
public class Explode {
public boolean prime(int number)
{
for(int n=2;n<number;n++)
{
if(number%n==0)
return false;
}
return true;
}
public int divide(int number)
{
if(prime(number))
{
System.out.print(number);
return number;
}
for(int m=2;m<number;m++)
{
if(prime(m)&&number%m==0)
{
System.out.print(m);
System.out.print("*");
number=number/m;
}
}
return divide(number);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Explode explode=new Explode();
System.out.println("请输入您要分解的正整数:");
Scanner in=new Scanner(System.in);
int number=in.nextInt();
if(explode.prime(number))
{
System.out.printf("%d=1*%d.",number,number);
}
else
{
System.out.printf("%d=",number);
explode.divide(number);
}
}
}
package javaimprove005;
import java.util.Scanner;
/*
* 【程序5】 ConditionOperator.java
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。解决这里问题的思路是一步一步分解问题,再反向回退,就可以得到嵌套表达。
*/
public class ConditionOperator {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入学生成绩:" );
Scanner in=new Scanner(System.in);
int score=in.nextInt();
System.out.printf("成绩为:%d,表示为:%s",score,(score>=90)?"A":(score>=60)?"B":"C");
}
}
package javaimprove006;
import java.util.Scanner;
/*
* 【程序6】GCDAndLCM.java
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
问题分析:这道题在前面的课堂在线作业的博客有。
*/
public class GCDAndLCM {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入两个正整数:");
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
int y=m%n;
int m1=m,n1=n;
while(y!=0)
{
m=n;
n=y;
y=m%n;
}
System.out.printf("最大公约数:%d\n",n);
System.out.printf("最小公倍数:%d\n",m1*n1/n);
}
}
package javaimprove007;
import java.util.Scanner;
/*
* 【程序7】 StChar.java
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
*/
public class StChar {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入您要统计的字符串:");
Scanner in=new Scanner(System.in);
String str=in.nextLine();
//System.out.println(str.charAt(1));
in.close();
int n=0;
int number=0;
int letter=0;
int space=0;
int others=0;
while(n<str.length())
{
if(str.charAt(n)>='0'&&str.charAt(n)<='9')
{
number+=1;
}else if((str.charAt(n)>='a'&&str.charAt(n)<='z')||(str.charAt(n)>='A'&&str.charAt(n)<='Z'))
{
letter+=1;
}else if(str.charAt(n)==' ')
{
space+=1;
}else
{
others+=1;
}
n++;
}
System.out.printf("数字:%d个\n字母:%d个\n空格:%d个\n其他:%d个\n",number,letter,space,others);
}
}
package javaimprove008;
import java.util.Scanner;
/*
* 【程序8】 TestAdd.java
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
*/
public class Add {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入循环控制数量:");
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for(int m=1;m<10;m++)
{
int sum=0;
int temp=0;
for(int k=0;k<n;k++)
{
temp+=Math.pow(10, k)*m;
sum+=temp;
}
System.out.printf("当a=%d时\t",m);
System.out.printf("和为:%d\n",sum);
}
}
}
package javaimprove009;
/*
* 【程序9】 WanShu.java
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
问题分析: 求出所有的因数,再相加是不是相等。
*/
public class PerfectNumber {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int n=1;n<1000;n++)
{
int sum=0;
for(int k=1;k<=n/2;k++)
{
if(n%k==0)
{
sum+=k;
}
}
if(sum==n)
{
System.out.println(sum);
}
}
}
}
package javaimprove010;
/*
* 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
* 这道题也可以用递归的思想去解决。
*/
public class Ball {
public double fall(double begin,int n)
{
if(n==1)
return begin/2;
return fall(begin/2,n-1);
}
public double total(double begin,int n)
{
double sum=begin;//fall只能计算出来第一次反跳后的高度。因此在我们计算总路程的时候,我们需要加上初始的高度。
for(int m=10;m>0;m--)
{
sum+=fall(begin,m);
}
return sum;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double begin=1000;
double sum=0;
for(int n=1;n<=10;n++)
{
sum+=begin;
begin=begin/2;
}
System.out.printf("当达到第十次是高度是:%f米\t此时共经过:%f米\n", begin,sum);
//递归的思想解决办法
Ball ball=new Ball();
//在计算的 过程中,会有一点误差。
System.out.printf("当达到第十次是高度是:%f米\t此时共经过:%f米", ball.fall(1000, 10),ball.total(1000, 10));
}
}