JAVA基础编程练习题全面解析.docx
- 文档编号:25077711
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:73
- 大小:112.82KB
JAVA基础编程练习题全面解析.docx
《JAVA基础编程练习题全面解析.docx》由会员分享,可在线阅读,更多相关《JAVA基础编程练习题全面解析.docx(73页珍藏版)》请在冰豆网上搜索。
JAVA基础编程练习题全面解析
JAVA基础编程练习题解答
【程序2】洗扑克牌
importjava.util.*;
classArrayExercise04{
publicstaticvoidmain(String[]args){
//洗牌
String[]cards={"红桃A","红桃B","红桃C","红桃D","大王",小王"};
washCards(cards);
System.out.println(Arrays.toString(cards));}
//洗牌
publicstaticvoidwashCards(String[]cards){
Randomr=newRandom();//创建并实例化一个获取随机数的对象
for(intx=0;x intindex=r.nextInt(cards.length);//获取数组中随机任意一个元素 Stringstr=null; str=cards[x]; cards[x]=cards[index]; cards[index]=str; } } } 【程序2】 题目: 古典问题: 有一对兔子,从出生后第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; Vector 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()); } } 【程序3】 题目: 判断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); } } 【程序4】 题目: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。 例如: 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); } } } } 【程序5】 题目: 将一个正整数分解质因数。 例如: 输入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); } } 【程序6】 题目: 利用条件运算符的嵌套来完成此题: 学习成绩>=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); } } 【程序7】 题目: 输入两个正整数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(Vector { 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(Vector { 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; Vector 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); } } 【程序8】 题目: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 解答: 这题需要对汉字的内码进行一定的了解,汉字占两个字节,每个字节的开始位为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); } } 【程序9】 题目: 求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); } } 【程序10】 题目: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如6=1+2+3.编程找出1000以内的所有完数。 解答: 根据题目意思,设计程序如下: importjava.io.*; importjava.util.*; publicclassText9{ publicstaticvoidfenJie(Vector { for(inti=1;i<=n/2;i++) if(n%i==0) m.addElement(i); } publicstaticbooleanpanBie(Vector { intsum=0; for(inti=0;i sum=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++) { Vector fenJie(pool,i); zhenjia=panBie(pool,i); if(zhenjia) System.out.println(i); } } } 【程序11】 题目: 一球从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); } } 【程序12】 题目: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数? 都是多少? 解答: 理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 基础 编程 练习题 全面 解析