50道JAVA基础编程练习题解答
本人尚属菜鸟,因此下面的解答有可能会出现错误,也可能使用的方法不够简便,希望指正。发现错误了,请QQ联系我,希望得到指正。
QQ:474027915
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? .程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 解答: (方法一) 利用数学分析可得知:这个月的兔子数量为前两个月的兔子数量之和,推导过程如下: X1,X2,X3 Y1,Y2,Y3 Z1,Z2,Z3 X1:表示一个月大的兔子;X2表示两个月大的兔子;X3表示三个月及三月以上的兔子。 有以下数学表达式: Y1=X2+X3 ,Y2=X1 ,Y3=X2+X3 Z1=Y2+Y3 ,Z2=Y1 ,Z3=Y2+Y3 Z1+Z2+Z3= Y2+Y3+Y1+(Y2+Y3)=(Y2+Y3+Y1)+(X2+X3+X1) 因此上面每个月的兔子的数量满足斐波那契数列。编程实现较为简单,此处省略。 (方法二) 方法二利用编程实现,具有一般性(开始兔子个数和产仔周期可自行输入),程序设计如下: import java.util.*; import java.io.*; class TuZi { int nianling=1; }
public class Text1 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub int shuliang=1; int zhouqi=4; int yuefen=0; Vector for(int j=0;j 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 解答: 程序如下: public class Text2 { public static void main(String[] args) { // TODO Auto-generated method stub int sum=0; System.out.print(\到200的素数是: \ for(int i=101;i<=200;i++) { int flag=0; for(int j=2;j<=Math.sqrt(i);j++) { float k=(float)i; if(k%j==0) { flag=1; break; } } if(flag==0) { System.out.print(i+\ sum++; } } System.out.println(\ System.out.print(\素数个数为: \ System.out.print(sum); } } 【程序3】 题目:打印出所有的\水仙花数\,所谓\水仙花数\是指一个三位数,其各位数字立方和等于该数本身。例如: 153是一个\水仙花数\,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 解答: 程序如下: public class Text3 { public static void main(String[] args) { int a=0;int b=0;int c=0; System.out.println(\到999的水仙花数为:\ for(int i=100;i<=999;i++) { a=i/100; b=i/10-a*10; c=i-b*10-a*100; if(i==a*a*a+b*b*b+c*c*c) { System.out.println(i); } } } } 【程序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的值,重复执行第一步。 这个题目很明显是要用递归算法来实现的,打印“*”有些技巧,但也很容易解决,程序如下: import java.io.*; public class Text4 { public static void chuLi(int n) { for(int i=2;i<=n;i++) { if(n==i) { System.out.print(i); return; } if(n>i&&(n%i==0)) { n=n/i; System.out.print(i+\ chuLi(n); break;//这句很重要 } } } public static void main(String[] args) throws IOException { int shu=0; BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); System.out.print(\请输入正整数:\ shu=(new Integer(stdin.readLine())); chuLi(shu); } } 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 解答: 此题较为简单,程序如下 import java.io.*; public class Text5 { public static void main(String[] agrs) throws IOException { System.out.print(\请输入成绩:\ BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); int chengji=new Integer(stdin.readLine()); char dengji=chengji<60?'C':(chengji>=90?'A':'B'); System.out.print(dengji); } } 【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 <求最大公约数> 算法(1)设计: E0.[确保mn] 若mn,则m n。 E1.[求余数] 以n除m并令r为所得余数。(我们将有0rn。) E2.[余数为0?] 若r为0,算法结束,n即为所求答案。 E3.[减少] 置mn,nr,并返回步骤E1。 数学证明: (1) 若m%n=0,则n为所求最大公因子 (2) 若m%n0,则只需证明下面命题成立 如果某数是n与m%n的最大公因子,则这个数也是m和n的最大公因子。(上面算法可化为这句话) 证明: 假设a是n和m%n的最大公因子,则有: 因有(m%n)%a=0,故可设m%n=k*a,k为正整数。又n%a=0,故可设n=p*a,p也为正整数。 可得数学表达式:m=t*n+m%n,其中t为不小于0的整数。 因此有:m=t*p*a+k*a=(t*p+k)*a,因此可得m%a=0 因此有如下两个表达式: a为m和n的公因子已经证毕。 如何确定a为m和n的最大公因子?(可用反证法证明) 证明: 假设m和n存在公因子b,且有b>a。 则有: 可以仿照上面的推导过程得出: 则b也是n和m%n的公因子,又b>a,与a是n和m%n的最大公因子矛盾。 综上,如果某数是n与m%n的最大公因子,则这个数也是m和n的最大公因子。 (3) 证毕。 对步骤E0的分析: 若m F1.[余数m/n] 以n除m,并令m为余数。 F2.[它是0?] 如果m=0,则此算法以n为答案而终止。 F3.[余数n/m] 以m除n,并令n是余数。 F4.[它是0?] 如果n=0,则算法以答案m而终止,否则返回步骤F1。 算法(2)可仿照算法(1)进行证明 <求最大公倍数> 算法设计: F1:求出m和n的较大者,令较大者为m,较小者为n。 F2:判断m能否被n整除,若能则m为两者最小公倍数。 F2:将n分解因式。 F3:将m依次乘以n的因子,判断乘积能否被n整除,若能则乘积为两者最小公倍数。 根据上面的算法,程序如下: import java.io.*; import java.util.*; public class Text6 { public static void fenJie(Vector public static int gongBeiShu(Vector public static int bigYinZi(int a,int b) { int r=a%b; int m=0; if(r==0) return b; else { a=b; b=r; m=bigYinZi(a,b); return m; } } public static void main(String[] args) throws IOException { Integer shu1=0;Integer shu2=0;int t=0; Vector