14道java经典编程题

日期:2018-06-26 08:47供稿中心:北大青鸟西安华美校区作者:刘老师

14道java经典编程题

【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….(单位是‘对’)

publicclassDemo01{

publicstaticvoidmain(String[]args){

for(inti=1;i<=20;i++)

System.out.println(f(i));

}

publicstaticintf(intx){

if(x==1||x==2)return1;

else

returnf(x-1)+f(x-2);

}

}

或者

publicclassDemo01{

publicstaticvoidmain(String[]args){

mathmymath=newmath();

for(inti=1;i<=20;i++)

System.out.println(mymath.f(i));

}

}

classmath{

publicintf(intx){

if(x==1||x==2)

return1;

else

returnf(x-1)+f(x-2);

}

}

心得:java中方法的调用常见的一种是类外调用(见上),还有一种就是类里调用,如:publicclassWorld{

publicvoidprint(){

System.out.println("Hello你好!");

}

publicstaticvoidmain(String[]args){

Worldtest=newWorld();

test.print();

}

}

【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

publicclassDemo02{

publicstaticvoidmain(String[]args){

intsum=0;

for(inti=101;i<=200;i++){

booleanflag=true;

for(intj=2;j<i;j++){

if(i%j==0)

{

flag=false;

break;

}

}

if(flag==true){

sum+=1;

System.out.println("101到200之间的素数:"+i);

}

}

System.out.println("101到200之间的素数个数:"+sum);

}

}

心得:break和continue的区别就在于break是结束当前的整个循环,continue是结束当前的循环,但是当前剩下的循环还要继续。如上方的循环,一旦不满足条件里面的for循环就整个结束,跳到外面的循环,但如果是continue那么就j++继续下一个循环。

【程序3】题目:打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

publicclassDemo03{

publicstaticvoidmain(String[]args){

mathmymath=newmath();

for(inti=100;i<=999;i++)

{

if(mymath.shuixianhua(i)==true)

System.out.println("水仙花数:"+i);

}

}

}

classmath{

publicbooleanshuixianhua(intx){

inta=0,b=0,c=0;

a=x/100;

b=(x%100)/10;

c=x%10;

if(x==a*a*a+b*b*b+c*c*c)

returntrue;

else

returnfalse;

}

}

【程序4】题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

1.程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n>i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。

(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

importjava.util.Scanner;

publicclassDemo04{

publicDemo04(){

//调用super()必须写在子类构造方法的第一行,否则编译不通过

super();

}

publicstaticvoidmain(String[]args){

//新创建一个输入的Scanner对象,然后赋值给in

Scannerin=newScanner(System.in);

System.out.println("请输入N的值:");

intN=in.nextInt();//输入数字赋值给N

System.out.print("分解质因数:"+N+"=");

newDemo04().fenjie(N);

}

publicvoidfenjie(intn){

for(inti=2;i<=n;i++){

if(n%i==0){

System.out.print(i);

if(n!=i){

System.out.print("*");

}

fenjie(n/i);//用n除以i的商,作为新的正整数,重复执行第一步

}

}

System.exit(0);//退出程序

}

}

【程序5】题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a>b)?a:b这是条件运算符的基本例子。

importjava.util.Scanner;

publicclassDemo05{

publicstaticvoidmain(String[]args){

Scannerin=newScanner(System.in);

System.out.println("请输入N的值:");

intN=in.nextInt();

System.out.println((N>=90)?"A":((N>=60)?"B":"C"));

}

}

【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.程序分析:利用辗除法。

importjava.util.Scanner;

publicclassDemo06{

publicstaticvoidmain(String[]args){

Scannersc=newScanner(System.in);

System.out.print("请输入正整数max:");

intmax=sc.nextInt();

System.out.print("请输入正整数min:");

intmin=sc.nextInt();

System.out.println("最大公约数"+maxgyd(max,min));

newDemo06().mingbd(max,min);

}

publicstaticintmaxgyd(intx,inty){

while(x%y!=0){

inttemp=x%y;

x=y;

y=temp;

}

returny;

}

publicvoidmingbd(intx,inty){

inttm=(x*y)/maxgyd(x,y);

System.out.println("最小公倍数"+tm);

}

}

心得:静态方法中是不能直接调用非静态方法的,要么在非静态方法前加上static,要么就先new一个对象,然后通过对象调用非静态方法,另外inttm=(x*y)/maxgyd(x,y)如果maxgyd(x,y)无返回值的话,则Java中提示不允许使用空类型tm。

【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

1.程序分析:利用for循环语句,if条件语句。

importjava.util.Scanner;

publicclassDemo07{

publicstaticvoidmain(String[]args){

Scannersc=newScanner(System.in);

System.out.println("请输入字符串:");

Stringstr=sc.nextLine();

char[]ch=str.toCharArray();//将字符串转换成字符数组

countuse=newcount();

use.count(ch);

}

}

classcount{

intdigital,character,blank,other;

publicvoidcount(char[]arr){

for(inti=0;i<arr.length;i++){

if(arr[i]>='0'&&arr[i]<='9')digital++;

elseif((arr[i]>='a'&&arr[i]<='z')||(arr[i]>='A'&&arr[i]<='Z'))character++;

elseif(arr[i]=='')blank++;

elseother++;

}

System.out.println("数字个数:"+digital);

System.out.println("字母个数:"+character);

System.out.println("空格个数:"+blank);

System.out.println("其他字符个数:"+other);

}

}

【程序8】题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

1.程序分析:关键是计算出每一项的值。

importjava.util.Scanner;

publicclassDemo08{

publicstaticvoidmain(String[]args){

Scannerin=newScanner(System.in);

System.out.print("请输入a的值:");

intss=in.nextInt();

System.out.print("请输入相加的个数:");

intcount=in.nextInt();

newDemo08().sum(ss,count);

}

publicvoidsum(inta,intb){

ints=0,sum=0;

for(inti=1;i<=b;i++){

s=s*10+a;

sum+=s;

}

System.out.println("总和s="+sum);

}

}

【程序9】题目:一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如6=1+2+3。编程找出1000以内的所有完数。

publicclassDemo09{

publicstaticvoidmain(String[]args){

mathmymath=newmath();

for(inti=1;i<=1000;i++){

if(mymath.wanshu(i)==true){

System.out.println("完数是"+i);

}

}

}

}

classmath{

publicbooleanwanshu(intx){

intsum=0;

for(intj=1;j<x;j++){

if(x%j==0){

sum+=j;

}else

continue;

}

if(sum==x){

returntrue;

}else

{returnfalse;}

}

}

【程序10】题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

publicclassDemo10{

publicstaticvoidmain(String[]args){

intgp=100,sum=0;

for(inti=1;i<=10;i++){

sum+=gp;

gp=gp/2;

sum+=gp;//来回

}

System.out.println("共经过"+sum+"米");

System.out.println("第十次反弹"+gp+"米");

}

}

【程序11】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

publicclassDemo11{

publicstaticvoidmain(String[]args){

intcount=0;

for(inti=1;i<=4;i++){

for(intj=1;j<=4;j++){

for(intk=1;k<=4;k++){

{

if(i!=j&&j!=k&&i!=k){

++count;

System.out.println(i*100+j*10+k);

}

}

}

}

}

System.out.println("共"+count+"个数");

}

}

【程序12】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润lirun,求应发放奖金总数sum?

1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

importjava.util.Scanner;

publicclassDemo12{

publicstaticvoidmain(String[]args){

longsum;

Scannerin=newScanner(System.in);

System.out.println("请输入当月利润(万元):");

doublelirun=in.nextDouble();

if(lirun<=10){

sum=Math.round((lirun*0.1));//Math.round()方法四舍五入

}

elseif(lirun<=20){

sum=Math.round((10*0.1+(lirun-10)*0.075));

}

elseif(lirun<=40){

sum=Math.round((10*0.1+10*0.075+(lirun-20)*0.05));

}

elseif(lirun<=60){

sum=Math.round((10*0.1+10*0.075+10*0.05+(lirun-40)*0.03));

}

elseif(lirun<=100){

sum=Math.round((10*0.1+10*0.075+10*0.05+10*0.03+(lirun-60)*0.015));

}

else{

sum=Math.round((10*0.1+10*0.075+10*0.05+10*0.03+10*0.015+(lirun-100)*0.01));

}

System.out.println("应发的奖金为"+sum);

}

}

心得:java中基本数据类型long是8个字节,double也是8个字节,如果将double值赋给long值,会出现精度损失,通常是将低精度赋值给高精度,如doublex=3可以,但是inty=3.4就不行了,因为3.4是double类型是高精度的。

【程序13】题目:一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?

1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:

classDemo13{

publicstaticvoidmain(String[]args){

for(inti=1;i<100000;i++){

if(Math.sqrt(i+100)%1==0)

if(Math.sqrt(i+100+168)%1==0){

System.out.println(i+"加上100后是完全平方数,加上168后也是完全平方数");

}

}

}

}

【程序14】题目:输入某年某月某日,判断这一天是这一年的第几天?

1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本月的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

importjava.util.Scanner;

importjava.util.Calendar;

classDemo14{

publicstaticvoidmain(Stringargs[]){

Scannerin=newScanner(System.in);

System.out.println("请输入年,月,日");

intyear=in.nextInt();

intmonth=in.nextInt();

intday=in.nextInt();

Calendarcal=Calendar.getInstance();//初始化一个日历对象

cal.set(year,month-1,day);//把日历定到某一时间

intsum=cal.get(Calendar.DAY_OF_YEAR);//获得这一年的第几天

System.out.println("是这一年的第"+sum+"天");

}

标签: Java 编程