Java基础编程50题(上)

【程序1】

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

分析:由于题目存在生兔子的逻辑,所以在刚开始分析时,并没有直接分析数列的规律。而是通过把每个月的兔子数目分成:兔子总数vs可生育兔子数。通过这两列数据的每月变换的联系,分析出了A(n+1)=A(n)+A(n-1) 这样的规律。即是著名的斐波那契数列的一种,1,1,2,3,5,8,13,21.... 


分析出公式以后,感觉到了挫败感。明明一眼就看出的数列规律,我居然画图找了半天生兔子的逻辑。。但是又转念一想,虽然这样的思考方式很迂回,但是更符合这个数列被发现时的过程,而不是像高中时学习的那样,简单的看数字。至少,更加有趣。

代码:

斐波那契数列本来就表达了一种递归关系,因此可以用这种逻辑来完成编写。

public class demo01 {
public static void main (String args[]){
	for (int month=1;month<8;month++){
		Dser a = new Dser();
		int sum = a.SumRabit(month);
		System.out.println("第"+month+"个月: "+sum+"只兔子");
	}
}
}

class Dser{
	public int SumRabit(int month ){	
		if (month==1||month==2)
			return 1;
		else
			return SumRabit (month-1)+SumRabit (month-2);
			
	}
}


结果吻合。

思考:当month很大时,计算机递归的速度会相当慢,如何降低时间复杂度o(n)?

斐波那契数列资料:https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97





【程序2】 
题目:判断101-200之间有多少个素数,并输出所有素数。 
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 
则表明此数不是素数,反之是素数。 

题目自带分析,逻辑清楚,只需要实现了。虽然这题的逻辑分析比第一题简单,但是编程稍微复杂一点。

public class demo01 {
public static void main (String args[]){
	PrimNum a=new PrimNum();
	int num=12;
	a.Show(num);
	
}
	
}

class PrimNum{
	
	int sum;
	
	public boolean Compare(){
		for(int i=2;i
结果吻合:

Java基础编程50题(上)_第1张图片


【程序3】 
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 

public class demo01 {
public static void main (String args[]){
	for(int i=100;i<1000;i++){
		Shuixian a=new Shuixian(i);
		a.Show();
		
	}
	 
	
}
	
}

class Shuixian{
	
	int two,ge,shi,bai,num;
	
	
	public  Shuixian(int num){
		this.num=num;
		this.two = num/10 ;this.ge = num%10; 
		this.shi = two%10;  this.bai = two/10;
		
			
	}
   public void Show(){
	 int a= (int)Math.pow(this.ge,3)+(int)Math.pow(this.shi,3)+(int)Math.pow(this.bai,3);
	 if(a==this.num)
		System.out.println(this.num+"是水仙数");  
	   
	   
   }
	
}


Java基础编程50题(上)_第2张图片


结果吻合。


【程序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的值,重复执行第一步。 

public class demo01 {
public static void main (String args[]){
	int num = 90;	
	Fenjie a=new Fenjie(num);
    System.out.print(num+"=");
	a.Process();
		
	}
	 
	
}
	


class Fenjie{
	
	int num;
	
	
	public  Fenjie(int num){
		this.num=num;
			
	}
	public int Zhishu(){
		for(int i=2;i

Java基础编程50题(上)_第3张图片

结果吻合。


【程序5】 
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下
的用C表示。 
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 

public class demo01 {
public static void main (String args[]){
	Pinggu a=new Pinggu(97);
	a.fenji();
	}
	 
	
}
	


class Pinggu{
	
	int note;
	char stu;
	
	public  Pinggu(int note){
		this.note=note;
			
	}
	public void fenji(){
		this.stu=(this.note>90)?'A':(this.note<60)?'C':'B';
		System.out.println("分数是 "+this.note+"  等级是 "+this.stu);
	}
  
	   
   
	
}

Java基础编程50题(上)_第4张图片

结果吻合。


【程序6】 
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 
1.程序分析:利用辗除法。 

public class demo01 {
public static void main (String args[]){
	liangshuyunsuan a=new liangshuyunsuan(112,9);
	a.gongyue();
	a.gongbei();
	
}
	 
	
}
	

class liangshuyunsuan{
	
	int numo;
	int numt;
	int gongyin;
	
	public  liangshuyunsuan(int a,int b){
		this.numo=(a>b?a:b);
		this.numt=(a>b?b:a);
		System.out.println("两数是:"+this.numo+" 和  "+this.numt);
			
	}
	public void gongyue(){
		int a=this.numo;
		int b=this.numt;
		int r1=a%b;
		while(r1!=0){
			a=b;
			b=r1;
			r1=a%b;	
		}
		System.out.println("最大公因数是:"+b);
		this.gongyin= b;
	}
  
	public void gongbei(){
		System.out.println("最大公倍数是:"+this.numo*this.numt/this.gongyin); 
	}   
   
	
}

Java基础编程50题(上)_第5张图片

结果吻合。


【程序7】 
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 
1.程序分析:利用while语句,条件为输入的字符不为'\n'. 

public class demo01 {
public static void main (String args[]){
	zifutongji a=new zifutongji("wozhidao我知道了 12345 &¥&%¥");
	a.tongji();
	a.show();
	
}
	 
	
}
	
class zifutongji{
	
	String input;
	int chara,alph,spa,nub,oth=0;
	
	zifutongji(String input)
	{
		this.input = input;
	}
	
	public void tongji()
	{
		for(int i=0;i


Java基础编程50题(上)_第6张图片

条件吻合。

Java中文编码的办法(Unicode):

https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/




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

import java.util.Scanner;


public class demo01 {
public static void main (String args[]){
	while(true)
	{
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入每位数: ");
		int num = sc.nextInt();
		System.out.println("请输入最大相加个数: ");
		int fach = sc.nextInt();
		addsame a=new addsame(num,fach);
		a.adds();
		System.out.println("和为: "+a.sum);
		System.out.println("请问是否结束? y/n ");
		String flag=sc.next();
		if(flag.equals("y"))
			break;
		else if (flag.equals("n"))
			continue;
		else
			System.out.println("输入错误,自动结束 ");
		sc.close();
	}
	
	
}
	 
	
}
	
class addsame{
	
	int gewei,num,fach=0;
	int sum=0;
	
	addsame(int num,int fach)
	{
		this.gewei=this.num =this.sum= num;
		this.fach=fach;
	}
	
	public void adds()
	{
		for(int i=1;i

结果吻合

Java基础编程50题(上)_第7张图片

发现了两个问题:

1.java键盘输入的三种方法:System.in/System.out , BufferedReader,Scanner.

2.String,int ,char  三者相互转换。判断字符串相等的小语句 A.equals.(B)


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

public class demo01 {
public static void main (String args[]){
	for(int i=1;i<=1000;i++)
	{
		int num = i;
		WanshuPD a=new WanshuPD(num);
		a. Zhishu();
	}
	
	
}
		
}
	 	
class WanshuPD{
	
	int num;
	int sum=0;
	
	
	WanshuPD(int num)
	{
		this.num=num;
		
	}
	
	public void Zhishu(){
		for(int i=1;i

Java基础编程50题(上)_第8张图片
结果吻合。


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

public class demo01 {
public static void main (String args[]){
		float hig = 100;
		int time=10;
		BallFall a=new BallFall(hig,time);
		a.sum();
		System.out.println("第"+time+"次,球的高度是"+a.hig+"米");
		System.out.println("              "+"球经过"+a.lang+"米");
	
	
	
}
		
}
	 	
class BallFall{
	
	float hig;
	int time;
	double lang=0;
	
	
	BallFall(float hig,int time)
	{
		this.hig=hig;
		this.time=time;
	}
	
	private void Faall(){
		this.lang=this.lang+1.5*this.hig;
		this.hig=this.hig/(float)2;
		
	}

	public void sum()
	{
		for(int i=1;i<=this.time;i++)
		{
			this.Faall();
		}
	}
}

Java基础编程50题(上)_第9张图片

结果吻合。


【程序11】 
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 

public class demo01 {
public static void main (String args[]){
		NummerSum a= new NummerSum();
		a.NumSer();
	
	}
}
	 	
class NummerSum{
	private int sum=0;
	public void NumSer()
	{
		for(int i=1;i<=4;i++)
		{
			for(int j=1;j<=4;j++)
			{
				for(int k=1;k<=4;k++)
				{
					if(i!=j&&j!=k&&i!=k)
					{
						sum++;
						System.out.println(i+j*10+k*100);
					}
						
					
				}
			}
			
		}
		System.out.println("各位不重复的三位数一共有"+sum+"个");
	}

	
}

Java基础编程50题(上)_第10张图片

结果吻合。

【程序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%提成,从键盘输入当月利润I,求应发放奖金总数? 
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 

import java.util.Scanner;


public class aufgabe12 {
private double bonus;
private double profit;

aufgabe12(double profit)
{
	bonus=0;
	this.profit=profit;
}

void kalku()
{
	if(profit<=10)
		bonus=profit*0.1;
	else if(profit>10 && profit<=20)
		bonus=1+(profit-10)*0.075;
	else if(profit>20 && profit<=40)
		bonus=1+0.75+(profit-20)*0.05;
	else if(profit>40 && profit<=60)
		bonus=1.75+1+(profit-40)*0.03;
	else if(profit>60 && profit<=100)
		bonus=2.75+0.6+(profit-60)*0.015;
	else 
		bonus=3.35+0.6+(profit-100)*0.01;
}

double show_bonus()
{
	return this.bonus;
}

public static void main(String[] args)
{
	Scanner sc = new Scanner(System.in); 
    System.out.println("please input the profit:"); 
    double profit = sc.nextDouble(); 
    sc.close();
	aufgabe12 bonus=new aufgabe12(profit);
	bonus.kalku();
	System.out.println("the bonus is $"+bonus.show_bonus());
}
}



【程序13】 
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足
如下条件,即是结果。请看具体分析: 

public class aufgabe13 {
private String unknown;

aufgabe13()
{
	unknown="the numbers are:\n ";
}

void find()
{
for(int i=0;i<10000000;i++)
{
	if(Math.sqrt(i+100)%1==0 && Math.sqrt(i+268)%1==0) //double 型模1,可取得其小数部分。
		unknown=unknown+i+"\n";
	else
		continue;
}
}

void show()
{
	System.out.println(unknown);
}

public static void main(String[] args)
{
	aufgabe13 test=new aufgabe13();
	test.find();
	test.show();
	
}
}


结果吻合。


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

import java.util.Scanner;

public class aufgabe14 {
private int year;
private int month;
private int day;
private int permutation;

aufgabe14(int year,int month,int day)
{
	this.year=year;
	this.month=month;
	this.day=day;
	this.permutation=0;
}

boolean leapyear()
{
	if(this.year%4==0 && this.year%100!=0||this.year%400==0)
		return true;
	else
		return false;
}

void permutation()
{
	int offs=0;
	if(leapyear())
		offs=1;
	if(this.month<=2)
		this.permutation=(this.month-1)*31+this.day;
	else if(this.month>2 && this.month<8)
		this.permutation=31+28+offs+(this.month-3)/2*61+(this.month-3)%2*31+this.day;
	else if(this.month>7 && this.month<13)
		this.permutation=212+offs+(this.month-8)/2*61+(this.month-8)%2*31+this.day;
}

void show()
{
	if(leapyear())
		System.out.println(this.year+" is a leapyear");
	System.out.println(this.year+"/"+this.month+"/"+this.day+"  : "+this.permutation);
}

public static void main(String[] args)
{
	Scanner sc = new Scanner(System.in); 
    System.out.println("please input year,month and day:"); 
    int year = sc.nextInt(); 
    int month = sc.nextInt(); 
    int day = sc.nextInt(); 
    sc.close();
	aufgabe14 test=new aufgabe14(year,month,day);
	test.permutation();
	test.show();
}
}


结果吻合。


【程序15】 
题目:输入三个整数x,y,z,请把这三个数由小到大输出。 
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x
与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 

import java.util.Scanner;

public class aufgabe15 {
private int x,y,z;

aufgabe15(int x,int y,int z)
{
	this.x=x;
	this.y=y;
	this.z=z;
}

void compare()
{
	int temp;
	if(x>y)
	{
		temp=x;
		x=y;
		y=temp;
	}
	else if(y>z)
	{
			if(x>z)
				this.show(z,x,y);	
			else
				this.show(x,z,y);	
	}
	else
		this.show(x,y,z);	

}

void show(int a,int b,int c)
{
	
	System.out.println(a+"<"+b+"<"+c);
}

public static void main(String[] args)
{
	Scanner sc = new Scanner(System.in); 
    System.out.println("please input three numbers "); 
    int x = sc.nextInt(); 
    int y = sc.nextInt(); 
    int z = sc.nextInt(); 
    sc.close();
	aufgabe15 test=new aufgabe15(x,y,z);
	test.compare();
}

}


结果吻合。


【程序16】 
题目:输出9*9口诀。 
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 

public class aufgabe16 {

static void printout()
{
	for(int i=1;i<10;i++)
		{
		for(int j=0;j




【程序17】 
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩
下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 

1.程序分析:采取逆向思维的方法,从后往前推断。 


public class aufgabe17 {
private int sum;
private int day;

aufgabe17(int day)
{
	sum=1;
	this.day=day;
}

void peachkalku()
{
	for(int i=1;i


结果吻合。


【程序18】 
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向
队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反

之是素数。 

public class aufgabe18 {

public static void main(String[] args)
{
	char[] list={'n','n','n'};
	char[] member={'x','y','z'};
	for(int i=2;i>=0;i--)
	{
		for(int j=0;j<3;j++)
		{
			if((i==0 && j==0) || (i==2 && j==0) || (i==2 && j==2))
				continue;
			if(member[j]=='n')
				continue;
			list[i]=member[j];
			member[j]='n';
			break;
		}
	}
	for(int i=0;i<3;i++)
	{
		int offs=(int)'a'+i;
		char temp=(char)offs;
		System.out.println(temp+"-------"+list[i]);
	}
	
}
}


结果吻合。


【程序19】 
题目:打印出如下图案(菱形) 

*** 
****** 
******** 
****** 
*** 

1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制

行,第二层控制列。 

public class aufgabe19 {

public static void main(String[] args)
{
	int[] a={1,3,6,8,6,3,1};
	for(int i=0;i<4;i++)
		{
		for(int j=1;j<=a[i];j++)
			System.out.print("*");
		System.out.println();
		}
	for(int i=4;i<7;i++)
	{
		for(int j=1;j<=a[i];j++)
			System.out.print("*");
		System.out.println();
	}
		
	
}

}




结果吻合。


【程序20】 
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 

1.程序分析:请抓住分子与分母的变化规律。 

public class aufgabe20 {
private double sum;
private int number;

aufgabe20(int number)
{
	this.number=number;
	this.sum=0;
}

int series(int k,int c)
{
	switch(c){
	case 0:
		if(k==1 || k==0)
			return 1;
		else
			return series(k-1,0)+series(k-2,0);
	case 1:
		if(k==0)
			return 1;
		else if(k==1)
			return 2;
		else
			return series(k-1,1)+series(k-2,1);
		default:
			return 1<<32;
	}
}

 void sum()
	{
	 	for(int i=1;i<=number;i++)
	 	{
	 		sum+=(double)series(i,1)/(double)series(i,0);
	 		System.out.print(series(i,1)+"/"+series(i,0)+"  ");
	 	}
	 	System.out.println();
	}
 
 void show()
 {
	 System.out.println("the sum of all "+number+" terms is : "+sum);
 }
 
 public static void main(String[] args)
 {
	 int number=20;
	 aufgabe20 test=new aufgabe20(number);
	 test.sum();
	 test.show();
	 
 }
}


结果吻合。


【程序21】 
题目:求1+2!+3!+...+20!的和 

1.程序分析:此程序只是把累加变成了累乘。 

public class aufgabe21 {
private int bound;
private int sum;

aufgabe21(int bound)
{
	this.bound=bound;
	this.sum=0;
}

int factor(int k)
{
	if(k==1)
		return 1;
	else
		return factor(k-1)*k;
}

void kalkul()
{
	for(int i=1;i<=this.bound;i++)
		sum+=factor(i);
		
}

void show()
{
	System.out.println("the factor of "+this.bound+" is : "+this.sum);
}

public static void main(String[] args)
{
	int bound=20;
	aufgabe21 test=new aufgabe21(bound);
	test.kalkul();
	test.show();
}
}


结果吻合。


【程序22】 
题目:利用递归方法求5!。 

1.程序分析:递归公式:fn=fn_1*4! 

public class aufgabe22 {
	
	static int factor(int k)
	{
		if(k==1)
			return 1;
		else
			return factor(k-1)*k;
	}
	
public static void main(String[] args)
{
	System.out.println(aufgabe22.factor(5));
}
}



结果吻合。


【程序23】 
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问
第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个
人多大? 
1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,

依次类推,推到第一人(10岁),再往回推。 

public class aufgabe23 {
static int age(int k)
{
	if(k==1)
		return 10;
	else
		return age(k-1)+2;
}

public static void main(String[] args)
{
	System.out.println(aufgabe23.age(5));
}
}


结果吻合。


【程序24】 

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 

public class aufgabe24 {
private int num;
private int[] temp=new int[5];
private int digit;

aufgabe24(int num)
{
 	this.num=num;
 	this.digit=0;
 	for(int i=0;this.num>1;i++)
	{
		temp[i]=this.num%10;
		this.num=this.num/10;
		digit++;
	}
}


void show()
{
	System.out.print("each digit is : ");
	for(int i=0;i


结果吻合。


【程序25】 
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 

public class aufgabe25 {
	private int num;
	private int[] temp=new int[5];
	
	aufgabe25(int num)
	{
	 	this.num=num;
	 	int a=this.num;
	 	for(int i=0;i<5;i++)
		{
			temp[i]=a%10;
			a=a/10;
		}
	}
	
boolean judgement()
{
	for(int i=0;i<2;i++)
		if(temp[i]!=temp[4-i])
			return false;
	return true;
}
void show()
{
	if(this.judgement())
		System.out.println(this.num+" is palindromic");
	else
		System.out.println(this.num+" is not palindromic");
}

public static void main(String[] args)
{
	int num=83409;
	aufgabe25 test1=new aufgabe25(num);
    test1.judgement();
	test1.show();
	aufgabe25 test2=new aufgabe25(13631);
    test2.judgement();
	test2.show();
	
}
}

结果吻合。


完成了一半了~ 撒花~~

你可能感兴趣的:(Java基础编程50题(上))