題目:古典問題:有一對兔子,從出生後第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));
}
}