50道JAVA基础编程练习题全面解答.docx
《50道JAVA基础编程练习题全面解答.docx》由会员分享,可在线阅读,更多相关《50道JAVA基础编程练习题全面解答.docx(62页珍藏版)》请在冰豆网上搜索。
50道JAVA基础编程练习题全面解答
50道JAVA基础编程练习题解答
本人尚属菜鸟,因此下面的解答有可能会出现错误,也可能使用的方法不够简便,希望指正。
发现错误了,请QQ联系我,希望得到指正。
QQ:
474027915
【程序1】
题目:
古典问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
.程序分析:
兔子的规律为数列1,1,2,3,5,8,13,21....
解答:
(方法一)
利用数学分析可得知:
这个月的兔子数量为前两个月的兔子数量之和,推导过程如下:
X1,X2,X3Y1,Y2,Y3Z1,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)
因此上面每个月的兔子的数量满足斐波那契数列。
编程实现较为简单,此处省略。
(方法二)
方法二利用编程实现,具有一般性(开始兔子个数和产仔周期可自行输入),程序设计如下:
importjava.util.*;
importjava.io.*;
classTuZi
{
intnianling=1;
}
publicclassText1{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
intshuliang=1;
intzhouqi=4;
intyuefen=0;
Vectorrongqi=newVector();
System.out.print("输入兔子开始数量:
");
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
shuliang=(newInteger(stdin.readLine()));
System.out.print("输入兔子生产周期:
");
zhouqi=(newInteger(stdin.readLine()));
System.out.print("输入查询月份:
");
yuefen=(newInteger(stdin.readLine()));
for(inti=1;i<=shuliang;i++)
{
rongqi.addElement(newTuZi());
}
for(inti=2;i<=yuefen;i++)
{
for(intj=0;j{
TuZia=(TuZi)rongqi.elementAt(j);
a.nianling++;
}
for(intj=0;j{
if(rongqi.elementAt(j).nianling>=zhouqi)
{
rongqi.addElement(newTuZi());
}
}
}
System.out.print("兔子数量为:
"+rongqi.size());
}
}
【程序2】
题目:
判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:
判断素数的方法:
用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
解答:
程序如下:
publicclassText2{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
intsum=0;
System.out.print("101到200的素数是:
");
for(inti=101;i<=200;i++)
{
intflag=0;
for(intj=2;j<=Math.sqrt(i);j++)
{
floatk=(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个数,每个数分解出个位,十位,百位。
解答:
程序如下:
publicclassText3{
publicstaticvoidmain(String[]args)
{
inta=0;intb=0;intc=0;
System.out.println("100到999的水仙花数为:
");
for(inti=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的值,重复执行第一步。
这个题目很明显是要用递归算法来实现的,打印“*”有些技巧,但也很容易解决,程序如下:
importjava.io.*;
publicclassText4{
publicstaticvoidchuLi(intn)
{
for(inti=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;//这句很重要
}
}
}
publicstaticvoidmain(String[]args)throwsIOException
{
intshu=0;
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
System.out.print("请输入正整数:
");
shu=(newInteger(stdin.readLine()));
chuLi(shu);
}
}
【程序5】
题目:
利用条件运算符的嵌套来完成此题:
学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
解答:
此题较为简单,程序如下
importjava.io.*;
publicclassText5{
publicstaticvoidmain(String[]agrs)throwsIOException
{
System.out.print("请输入成绩:
");
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
intchengji=newInteger(stdin.readLine());
chardengji=chengji<60?
'C':
(chengji>=90?
'A':
'B');
System.out.print(dengji);
}
}
【程序6】
题目:
输入两个正整数m和n,求其最大公约数和最小公倍数。
<求最大公约数>
算法
(1)设计:
E0.[确保m
n]若m
n,则m
n。
E1.[求余数]以n除m并令r为所得余数。
(我们将有0
r
n。
)
E2.[余数为0?
]若r为0,算法结束,n即为所求答案。
E3.[减少]置m
n,n
r,并返回步骤E1。
数学证明:
(1)若m%n=0,则n为所求最大公因子
(2)若m%n
0,则只需证明下面命题成立
如果某数是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当进行E0后,m为较大者,m%n
n。
算法
(2)设计:
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整除,若能则乘积为两者最小公倍数。
根据上面的算法,程序如下:
importjava.io.*;
importjava.util.*;
publicclassText6{
publicstaticvoidfenJie(Vectorm,intn)
{
for(inti=2;i<=n;i++)
{
if(n==i)
{
m.addElement(i);
return;
}
if(n>i&&(n%i==0))
{
n=n/i;
m.addElement(i);
fenJie(m,n);
break;
}
}
}
publicstaticintgongBeiShu(Vectorm,inta,intb)
{
intchengji=1;
if(a%b==0)
returna;
for(inti=0;i{
chengji=chengji*m.elementAt(i);
if((a*chengji)%b==0)
{
returna*chengji;
}
}
returna*b;
}
publicstaticintbigYinZi(inta,intb)
{
intr=a%b;
intm=0;
if(r==0)
returnb;
else
{
a=b;
b=r;
m=bigYinZi(a,b);
returnm;
}
}
publicstaticvoidmain(String[]args)throwsIOException
{
Integershu1=0;Integershu2=0;intt=0;
Vectorpool=newVector();
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
System.out.print("请输入第一个正整数:
");
shu1=(newInteger(stdin.readLine()));
System.out.print("请输入第二个正整数:
");
shu2=(newInteger(stdin.readLine()));
if(shu1{
t=shu2;
shu2=shu1;
shu1=t;
}
fenJie(pool,shu2);
t=bigYinZi(shu1,shu2);
System.out.println("最大公约数是:
"+t);
t=gongBeiShu(pool,shu1,shu2);
System.out.print("最小公倍数:
"+t);
}
}
【程序7】
题目:
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
解答:
这题需要对汉字的内码进行一定的了解,汉字占两个字节,每个字节的开始位为1。
程序如下:
importjava.io.*;
publicclassText7{
publicstaticvoidmain(String[]agrs)throwsIOException
{
Stringzifuchuan=newString("");
inthanzishu=0;intzimu=0;intkongge=0;intshuzi=0;intqita=0;
System.out.print("请输入一行字符:
");
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
zifuchuan=stdin.readLine();
byte[]bytes=zifuchuan.getBytes();
for(inti=0;i{
if((bytes[i]>=65&&bytes[i]<=90)||(bytes[i]>=97&&bytes[i]<=122))
zimu++;
elseif(bytes[i]==32)
kongge++;
elseif(bytes[i]>=48&&bytes[i]<=57)
shuzi++;
elseif(bytes[i]<0)
hanzishu++;
else
qita++;
}
System.out.println("字符串所占字节个数为:
"+bytes.length);
System.out.println("汉字个数为:
"+hanzishu/2);
System.out.println("英文字母个数为:
"+zimu);
System.out.println("空格个数为:
"+kongge);
System.out.println("数字个数为:
"+shuzi);
System.out.println("其他字符个数为:
"+qita);
}
}
【程序8】
题目:
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
解答:
在此题中,利用进行字符串运算的“+”运算符,然后将字符串转为数字,实现了程序过程,程序设计如下:
importjava.io.*;
publicclassText8{
publicstaticvoidmain(String[]args)throwsIOException
{
ints=0;inta=0;intsum=0;Stringp="";
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
System.out.print("请输入数字a:
");
a=newInteger(stdin.readLine());
System.out.print("请输入数字个数s:
");
s=newInteger(stdin.readLine());
for(inti=1;i<=s;i++)
{
Characterc=(char)(a+'0');
p=c.toString();
for(intj=1;j
{
p=p+a;
}
intd=Integer.parseInt(p);
sum=sum+d;
}
System.out.println("结果为:
"+sum);
}
}
【程序9】
题目:
一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如6=1+2+3.编程找出1000以内的所有完数。
解答:
根据题目意思,设计程序如下:
importjava.io.*;
importjava.util.*;
publicclassText9{
publicstaticvoidfenJie(Vectorm,intn)
{
for(inti=1;i<=n/2;i++)
if(n%i==0)
m.addElement(i);
}
publicstaticbooleanpanBie(Vectorm,intn)
{
intsum=0;
for(inti=0;isum=sum+m.elementAt(i);
if(sum==n)
returntrue;
else
returnfalse;
}
publicstaticvoidmain(String[]args)throwsIOException
{
booleanzhenjia=false;
System.out.println("1000以内的完数为:
");
for(inti=2;i<1000;i++)
{
Vectorpool=newVector();
fenJie(pool,i);
zhenjia=panBie(pool,i);
if(zhenjia)
System.out.println(i);
}
}
}
【程序10】
题目:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?
第10次反弹多高?
解答:
此题较为简单,程序设计如下:
importjava.io.*;
publicclassText10{
publicstaticvoidmain(String[]args)throwsIOException{
floatheigh=100;intcishu=10;floatsum=0;
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
System.out.print("输入初始下落高度:
");
heigh=(newFloat(stdin.readLine()));
sum=heigh;
System.out.print("输入落地碰撞次数:
");
cishu=(newInteger(stdin.readLine()));
for(inti=1;i{
heigh=heigh/2;
sum=sum+heigh*2;
}
System.out.println("第"+cishu+"次反弹高度为:
"+heigh);
System.out.println("第"+cishu+"次落地总经过长度为:
"+sum);
}
}
【程序11】
题目:
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
都是多少?
解答:
理解好排列组合,可设计程序如下:
publicclassText11{
publicstaticvoidmain(String[]args){
int[]a={1,2,3,4};
System.out.println("满足条件的三位数是:
");
for(inti=0;i{
for(intj=0;j{
if(j==i)
continue;
for(intk=0;k{
if(k==i||k==j)
continue;
for(inth=0;h{
if(h==i||h==j||h==k)
continue;
System