java经典编程

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…(单位是‘对’)

public class Demo01{
	public static void main(String[] args){
		for(int i=1;i<=20;i++)
			System.out.println(f(i));
		}
		public static int f(int x){
			if(x==1||x==2) return 1;
			else 
			   return f(x-1)+f(x-2);
			 }
	
}

或者

public class Demo01{
	public static void main(String[] args){
		math mymath=new math();
		for(int i=1;i<=20;i++)
			System.out.println(mymath.f(i));
		}
	}
	class math{
		public int f(int x){
			if(x==1||x==2)
				return 1;
				else
				   return f(x-1)+f(x-2);
				 }
				}		

心得:java中方法的调用常见的一种是类外调用(见上),还有一种就是类里调用,如:public class World{ public void print(){ System.out.println("Hello 你好!"); } public static void main(String[] args){ World test=new World(); test.print(); } }

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

public class Demo02{
	public static void main(String[] args){
		int sum=0;
		for(int i=101;i<=200;i++){
			boolean flag=true;
		for(int j=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个数,每个数分解出个位,十位,百位。

public class Demo03{
	public static void main(String[] args){
		math mymath=new math();
		for(int i=100;i<=999;i++)
			{
				if(mymath.shuixianhua(i)==true)
				System.out.println("水仙花数:"+i);
			}
		}
	}
class math{
	public boolean shuixianhua(int x){
		int a=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)
		return true;
		else
		return false;
	}
}

【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
1.程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。
(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

import java.util.Scanner;
public class Demo04{
	public Demo04(){
		//调用super()必须写在子类构造方法的第一行,否则编译不通过
		super();
		}
		public static void main(String[] args){
			//新创建一个输入的Scanner 对象,然后赋值给in
			Scanner in=new Scanner(System.in);
			System.out.println("请输入N的值:");
			int N=in.nextInt();//输入数字赋值给N
			System.out.print("分解质因数:"+N+"=");
			new Demo04().fenjie(N);
			}
			public void fenjie(int n){
				for(int i=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这是条件运算符的基本例子。

import java.util.Scanner;
public class Demo05{
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		System.out.println("请输入N的值:");
		int N=in.nextInt();
		System.out.println((N>=90)?"A":((N>=60)?"B":"C"));
		}
}

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

import java.util.Scanner;
public class Demo06{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.print("请输入正整数max:");
		int max=sc.nextInt();
		System.out.print("请输入正整数min:");
		int min=sc.nextInt();
		System.out.println("最大公约数"+maxgyd(max,min));
		new Demo06().mingbd(max,min);
		}
		public static int maxgyd(int x,int y){
			while(x%y!=0){
				int temp=x%y;
				x=y;
				y=temp;
			}
			return y;
				}
			public void mingbd(int x,int y){
				int tm=(x*y)/maxgyd(x,y);
				System.out.println("最小公倍数"+tm);
				}
			}

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

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

import java.util.Scanner;
public class Demo07{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入字符串:");
		String str=sc.nextLine();
		char[] ch=str.toCharArray();//将字符串转换成字符数组
		count use=new count();
		use.count(ch);
		
		}
}
class count{
	int digital,character,blank,other;
	public void count(char[] arr){
		for(int i=0;i<arr.length;i++){
			if(arr[i]>='0'&& arr[i]<='9') digital++;
			else if((arr[i]>='a'&& arr[i]<='z')||(arr[i]>='A'&& arr[i]<='Z')) character++;
			else if(arr[i]==' ') blank++;
			else other++;
			
		}
		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.程序分析:关键是计算出每一项的值。

import java.util.Scanner;
public class Demo08{
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		System.out.print("请输入a的值:");
		int ss=in.nextInt();
		System.out.print("请输入相加的个数:");
		int count=in.nextInt();
		new Demo08().sum(ss,count);
	}
	public void sum(int a,int b){
		int s=0,sum=0;
		for(int i=1;i<=b;i++){
			s=s*10+a;
			sum+=s;
			}
		System.out.println("总和s="+sum);
		}
}

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

public class Demo09{
	public static void main(String[] args){
		math mymath=new math();
		for(int i=1;i<=1000;i++){
			if(mymath.wanshu(i)==true){
				System.out.println("完数是"+i);
				}
		}
		}

}
class math{
	public boolean wanshu(int x){
		int sum=0;
		for(int j=1;j<x;j++){
			if(x%j==0){
				sum+=j;			
		}else
		continue;
		}
		if(sum==x){
			return true;
			}else
			{return false;}
	}
}

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

public class Demo10{
	public static void main(String[] args){
		int gp=100,sum=0;
		for(int i=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。组成所有的排列后再去掉不满足条件的排列。

public class Demo11{
	public static void main(String[] args){
		int count=0;
		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 ){
							++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.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

import java.util.Scanner;
public class Demo12{
	public static void main(String[] args){
		long sum;
		Scanner in=new Scanner(System.in);
		System.out.println("请输入当月利润(万元):");
		double lirun=in.nextDouble();
		if(lirun<=10){
			sum=Math.round((lirun*0.1));//Math.round()方法四舍五入
			}
			else if(lirun<=20){
				sum=Math.round((10*0.1+(lirun-10)*0.075));
				}
				else if(lirun<=40){
					sum=Math.round((10*0.1+10*0.075+(lirun-20)*0.05));
					}
					else if(lirun<=60){
						sum=Math.round((10*0.1+10*0.075+10*0.05+(lirun-40)*0.03));
						}
						else if(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值,会出现精度损失,通常是将低精度赋值给高精度,如double x=3可以,但是int y=3.4就不行了,因为3.4是double类型是高精度的。

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

 class Demo13{
 	public static void main(String[] args){
 		for(int i=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时需考虑多加一天。

import java.util.Scanner;
import java.util.Calendar;
class Demo14{
	public static void main(String args[]){
		Scanner in=new Scanner(System.in);
		System.out.println("请输入年,月,日");
		int year=in.nextInt();
		int month=in.nextInt();
		int day=in.nextInt();
		Calendar cal=Calendar.getInstance();//初始化一个日历对象
		cal.set(year,month-1,day);//把日历定到某一时间
		int sum=cal.get(Calendar.DAY_OF_YEAR);//获得这一年的第几天
		System.out.println("是这一年的第"+sum+"天");
		}
}

【程序15】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。

package test;
import java.util.*;
public class Demo {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		System.out.println("请输入三个数:");
		double x=in.nextDouble();
		double y=in.nextDouble();
		double z=in.nextDouble();
		double[] a=new double[]{x,y,z};
		Arrays.sort(a);//调用Arrays数组中的排序方法
		for(double sc:a){
			System.out.println(sc);
		}
	}

}

【程序16】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩
下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。

package test;

import java.util.*;
public class Demo {
	
	public static void main(String[] args) {  
        int sum=1;
        for(int i=9;i>=1;i--){
        	sum=(sum+1)*2;//假设第9天有x个,那么x-x/2-1=1个
        }
        System.out.println(sum);
    }  

}

【程序17】 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程
序找出三队赛手的名单。

package test;

import java.util.*;
public class Demo {
	
	public static void main(String[] args) {  
		String[] one=new String[]{"a","b","c"};
		String[] two=new String[]{"x","y","z"};
		for(int i=0;i<one.length;i++)
			for(int j=0;j<two.length;j++){
				if(one[i]=="a"&&two[j]=="x")
					continue;
				else if((one[i]=="c"&&two[j]=="x")||(one[i]=="c"&&two[j]=="z"))
					continue;
				else if(one[i]=="a"&&two[j]=="y")
					continue;
				else if((one[i]=="b"&&two[j]=="y")||(one[i]=="b"&&two[j]=="z"))
					continue;
				else
					System.out.println(one[i]+" VS "+two[j]);
			}
		
		
	}

}

【程序18】 题目:利用递归方法求5!。
1.程序分析:递归公式:f(n)=f(n-1)*4!

package test;
/**
 * 递归公式:f(n)=f(n-1)*4!
 */
import java.util.*;
public class Demo {
	
	public static void main(String[] args) { 
		
		Scanner in=new Scanner(System.in);
		System.out.println("请输入一个数:");
		int a=in.nextInt();
		System.out.println(a + "的阶乘为:" + fac(a)); 
	}
	public static long fac(int a){
		long value=0;
		if(a==0||a==1){
			value=1;
		}else if(a>1){
				value=a*fac(a-1);
			}
		return value;
		}
}


【程序19】给一个整数n,计算它的二进制中1的个数。
提示:n如果是奇数的那么它的二进制中1的个数是n/2的二进制中1的个数+1

public class Demo {
	public static void main(String[] args) { 
		System.out.println(ff(100));
		
	}
	public static  int ff(int n){
		if(n==0){//出口
			return 0;
		}
		if(n%2!=0){
			return ff(n>>1)+1;
		}else{
			return ff(n>>1);
		}
	}

}
// >>右移运算符,num >> 1,相当于num除以2,等价于num/2

运行结果:
3

【程序20】给出一个整型数组,实现全排列
公式:p(n,m)=n(n-1)(n-2)……(n-m+1)=n!/(n-m)! 从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列

/**
 * 递归实现n个元素的全排列
 * 
 * @author Administrator
 *
 */
public class Perm {
	static int arr[] = { 1, 2, 3,4};


	public static void main(String[] args) {

		perm(arr, 0, arr.length - 1);
	}


	/*
	 * 算法思路:
	 * 
	 * (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);
	 * 
	 * (2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
	 * 
	 * (3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,
	 * 
	 * 等到出口,出口出去后还需要还原数组;
	 */


	/**
	 * 将每个元素放作第一个元素
	 * 
	 * @param index1
	 * @param index2
	 */
	public static void swap(int index1, int index2) {
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}


	/**
	 * 实现全排列
	 * 
	 * @param arr
	 * @param start
	 * @param end
	 */
	public static void perm(int arr[], int start, int end) {
		if (start == end) {// 出口
	      for (int i = 0; i <= end; i++) {
					           System.out.print(arr[i] + " ");
			}
			System.out.println();
			return;
		} else {
			for (int j = start; j <= end; j++) {
				swap(start, j);
				perm(arr, start + 1, end);
				swap(start, j);//还原数组
			}
		}
	}
	
}

【程序21】打印出下面两个数组的交集,结果不能重复
String[] arr1 = {“112”,“wqw”,“2121”};
String[] arr2 = {“112”,“aad”,“ewqw”};
打印出两个数组的交集,结果不能重复

package com.example.demo;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.*;

@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		String[] array1 = {"123","abc","edf","cgh"};
		String[] array2 = {"456","cgh","gga","abc"};
		String[] newarray = StringIntersection(array1,array2);
		for (String str : newarray) {
			System.out.println(str);
		}

	}
	public static String[] StringIntersection(String[] array1,String[] array2){
		Map<String,Boolean> map = new HashMap<String,Boolean>();
		List<String> list = new LinkedList<String>();//此处换成ArrayList结果相同
		for (String str : array1) {
			if (!map.containsKey(str)){
				map.put(str,false);
			}
		}
		for (String str : array2) {
			if (map.containsKey(str)){
				map.put(str,true);
			}
		}
		//方式1
		for (Map.Entry<String,Boolean> aa : map.entrySet()) {
			if (aa.getValue()){
				list.add(aa.getKey());
			}
		}
		//方式2
		Set<Map.Entry<String,Object>> entrys = map.entrySet();
		if(entrys != null){
			Iterator<Map.Entry<String,Object>> iter = entrys.iterator();
			while (iter.hasNext()) {
				Map.Entry<String,Object> ss =iter.next();
				if (ss.getValue()){
				list.add(ss.getKey());
			}
		}
		String[] result={};
		return list.toArray(result);
	}

}

运行结果:
abc
cgh

分析:因为Map这个类没有继承Iterable接口所以不能直接通过map.iterator来遍历(list,set就是实现了这个接口, 所以可以直接这样遍历),所以就只能先转化为set类型,用entrySet()方法,set中的每一个元素值就是map中的一个键值对,也就是Map.Entry<K,V>。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值