Java基础练习题

1.计算输入数据的阶乘值

这里有两种方法,循环在此不做介绍

递归

程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接嗲用自身的一种方法,他通常把一个大型阀组的问题层层转化为一个于原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当递归条件满足时,递归返回。

例如汉诺塔问题、斐波那契数列

递归的两个条件

1.可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式

2.存在一种简单情景,可以使递归在简单情景下退出

递归三要素

1.一定有一种可以退出程序额情况

2.总是在尝试将一个问题化简到更小的规模

3.父问题与子问题不能有重叠的部分

//循环方法
long sum = 1;
	for(int i =1;i<=10;i++ ) {
		sum = i*sum;
	}
	System.out.println(sum);


//递归方法
Scanner sc =  new Scanner(System.in);
	System.out.println("请输入一个数");
	int num = sc.nextInt();
	int  res = A(num);
    System.out.println(res);
}	
	//递归算法解决
	public static int A(int len) {
		if(len == 1)
			return 1;
		return len*A(len-1);
	}

 调用递归是循环操作的最后一道防线

2.互换两个数的值(不允许使用中间变量)  

思路:考核变量的概念

int a = 3,b = 2;
a = a+b;  //此时a = 5
b = a-b;  //此时b = 5-2 = 3
a = a-b;  //此时a = 5-3 = 2
System.out.println(a);
System.out.println(b);

3.输出三个数中的最大值和最小值

三目运算符

思路:获取前两个数值中较大的数

获取第三个数和上一步较大数中最大的数

Scanner sc = new Scanner(System.in);
System.out.println("请输入三个整数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
System.out.println(((num1 > num2) ? num1 : num2)>num3 ?  ((num1 > num2) ? num1 : num2):num3 );
//直接在控制台输出最大值  不建议这种写法,但是这种方法可以锻炼三目运算符的逻辑  可以拆开来写
int temp = num1 > num2 ? num1 : num2; //如果num1 > num2,则返回num1,否则返回num2
int max = temp > num3 ? temp : num3;  //temp获取的是num1和num2中较大的数,然后和num3进行比较就可获取到三个数中最大的数
System.out.ptintln(max);

三目运算符的考点

int k1 = 12, k2 = 5;
int num = (k1>k2) ? ++k1 : k2++;
//这里需要注意  ++k是先+1在获取k的值  k++是先获取k的值在进行+1操作  
System.out.println("num="+k1+"———"+k2);
//输出结果为: num=13———5

还可以用Math.max获取两个数中的最大值

Scanner sc = new Scanner(System.in);
int[] arr = new int[3];
for(int i = 0;i < arr.length;i ++){
 System.out.println("输入整数:");
 int a = sc.nextInt();
 arr[i] = a;
}
int temp = Math.max(arr[0],arr[1]);
int max = Math.max(temp,arr[2]);
System.out.println(max);

4.输出1-100的奇数 每行输出6个

public static void main(String[] args) {
		int a = 0;
		for (int i = 0; i < 100; i++) {
			if (i % 2 != 0) {
				System.out.print(i + "\t");
				if (++a % 6 == 0) {
					System.out.println();//每行输出6个   注意这个判断语句的位置
				}
			}
		}
	}

5.1-100求和(for while以及do/while的写法)

//for循环
	int res = 0;		
	for(int i = 1;i <= 100;i ++){    
	    res = res+i;   
	}
	System.out.println(res);
	
	System.out.println("-----------");
	
    //do...while循环
	int res1 = 0;
	int k = 0;
	do {
		res1 +=k++ ;
	}while(k <= 100); {
		System.out.println(res1);
	}

	System.out.println("-----------");

	//while循环
	int res2 = 0;
	int k1 = 0;
	while(k1 < 100) {
		k1++;
		res2 += k1;	
	}
	System.out.println(res2);  

以上三种写法(不止针对本题)对于刚开始学习的小白来说极为重要,关键在于弄清楚各种算数运算符的含义,以及锻炼循环的逻辑思维。

6.1-100奇数和

//for循环
//第一种方法
int res = 0;
for(int i = 0;i < 100;i ++){
    if(i%2 != 0){
        res += i;
    }
    System.out.println(res);
}
//第二种方法
for(int i = 1;i < 100;i+=2){  //for循环中第三表达式不一定只能加1
    res+=i;
}
System.out.println(res);


//练习continue和break的用法
//for循环里判断
int sum = 0;
	for(int i = 0;i < 100;i ++){
		if(i%2 == 0){
	        continue; 
	    }
		sum += i;
	}
	System.out.println(sum);

//while循环
int temp = 0;
int k = 0;
while(true){
    if(++k > 100){
        break;  //避免死循环  立即终止程序
    }
    if(i%2 == 0){
        continue;  //当为偶数的时候跳过不执行下边语句
    }
    res += i;
}
System.out.println(temp);

7.输出1-100可以被三整除的数,每行输出6个

8.求100以内可以被三整除但不能被5整除的数,每行输出6个

两个题的思路是一样的,同时满足两个条件就是用到逻辑运算符--&&--

//1-100以内可以被三整除的数
int count = 0;
for(int i = 0;i < 100;i ++){
    if(i%3 == 0){
        System.out.print(i);
        if(++count%6 ==0){
        sSystem.out.println();
    }
    }
}
//1--100以内可以被三整除同时不能被5整除的数就是if条件判断的时候 ‘并且’ 第二个条件
//if(i%3 == 0 && i%5 != 0)

9.打印出所有的水仙花数

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

//由于提前知道水仙花数是三位数  所以这里进行判断是可以减少循环次数
for(int i = 100;i < 1000;i++){
    int a = i / 100;    //获取百位数
    int b = (i /10)%10; //获取十位数
    int c = i % 10;     //获取个位数
    if(a*a*a + b*b*b +c*c*c == i){
        System.out.print(i+"\t");
    }
}

10.判断一个数是否为质数

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

/*
	 * Scanner sc = new Scanner(System.in);
	System.out.println("请输入一个自然数:");
	int temp = sc.nextInt();
	for(int i = 2;i < temp;i++){
	    if(temp%i == 0){
	        System.out.println("这个数不是质数");
	        break;
	    }else{
	        System.out.println("这个数是质数");
	        break;
	    }
	}
	 */
    /*
	 * 注意这个逻辑是错误的 对于刚学习代码的小白这里是大坑(本人刚开始学习代码  各路大神勿喷)
	这里的if  else结构判断没有错误  正常理解就是如果if成立就输出不是质数,如果不成立就直接
	输出是质数  但是重点是这是在一个for循环里边,举例如果我们输入要判断的数是21,那么在i=2
	的时候就是temp%i!=0,也就是if不成立  直接就会跳转到else 输出是质数  然后就break结束 
	但本身21不是质数  所以会出现逻辑错误
	那么我们在考虑没有else的情况,if里边的判断语句会随着i++的操作一直进行判断,满足条件的时候
	就会输出 这个数不是质数 就上边这个错误的代码来说 控制台没有任何输出(if里边的判断逻辑是正确的)
	也就是这个数是质数
	所以个人认为在  “有些情况下”  for循环里嵌套if  else结构会出现一些逻辑错误 
	那么直接没有else判断语句此代码就没有逻辑错误  下边展示的是正确代码
    */

Scanner sc = new Scanner(System.in);
	int temp = sc.nextInt();
	int count = 0;
	for(int i = 2;i < temp;i ++) {
		if(temp%i == 0) {
			System.out.println("这个数不是质数");
			count++;			
			break;
		}		
	}
	if(count == 0) {
		System.out.println("这个数是质数");
	}
	sc.close();
//这里的临时变量count就是为了判断并且在控制台输出  “这个数是质数” 没有其他用处

 11.编程输出101-205之间的所有质数

   public static void main(String[] args) {
		for (int i = 101; i < 205; i++) {
			boolean temp = function(i); //调用方法进行判断在此范围内的质数
			if (temp) {
				System.out.println(i);
			}
		}
	}
	//分装一个方法,用于实现指定数据是否为质数的判断
	public static boolean function(int i) {
		boolean num = true;  //默认为为true,默认值为质数
		for (int k = 2; k < i; k++) {
			if (i % k == 0) {
				num = false;
				break;
			}
		}
		return num;
	}

12.输入两个正整数n和m,求其最大公约数和最小公倍数

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。

//求最大公约数
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int min = Math.min(m,n);
for(int i = min;i > 0;i --){
    if(m%i == 0 && n%i == 0){
        System.out.println(i);
    }
}

//求最大公约数
public static void main(String[] args){
    int m,n;
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入整数:")
    while(true){
        m = sc.nextInt();
        if(m < 2){
            System.out.println("输入有误!请重新输入:");
        }else
            break;    
    }
    System.out.println("请输入整数:")
        while(true){
        n = sc.nextInt();
        if(n < 2){
            System.out.println("输入有误!请重新输入:");
        }else
            break;    
    }
    int f = few(m,n)
        if(f > 1){
            System.out.println("两个整数"+m+","+n+"最大公约数为:"+f);
        }
}
public static int few(int num1,int num2){
    int res = 1;
    for(int i = min;i > 0;i --){
    if(m%i == 0 && n%i == 0){
        res = i;
        break;
    }
}
    return res;
}
//求最小公倍数
//其实和求最大公约数的方法一样,最大公约数就是从两个整数中较小的一个整数开始判断,整数的因数最大不会超过其本身,所以判断的最大范围就是较小的那个整数的本身,依次判断即可。从最大范围开始一次--(减减)操作,如果在此范围内的一个数可以被输入的两个数同时整除,那么这个数就是两个整数的最大公约数。相同的想法,按照最小公倍数的定义,特殊情况下最小公倍数刚好就是两个数中最大那个数的本身,但是无上限,所以判断条件的范围最小就是两个数中最大的,最大无上限。这里只展示判断时执行的代码语句
public static int multiple(int num1,int num2){
    int max = Math.max(num1,num2);
    int res = 1;
    for(int i =max;i > 0;i ++){
    if(i%num1 == 0 && i%num2 == 0){
        res = i;
        break;
    }
}
    return res;
}

(最小公倍数) 其实和求最大公约数的方法一样,最大公约数就是从两个整数中较小的一个整数开始判断,整数的因数最大不会超过其本身,所以判断的最大范围就是较小的那个整数的本身,依次判断即可。从最大范围开始一次--(减减)操作,如果在此范围内的一个数可以被输入的两个数同时整除,那么这个数就是两个整数的最大公约数。相同的想法,按照最小公倍数的定义,特殊情况下最小公倍数刚好就是两个数中最大那个数的本身,但是无上限,所以判断条件的范围最小就是两个数中最大的,最大无上限。这里只展示判断时执行的代码语句

13.100-50000之间有多少整数,其每个位上的数字之和为5,分别是哪些整数(例如:1211 1+2+1+1=5),并统计满足条件的整数有多少个

    //范围是100-50000  所以分开判断
    int count = 0;
	int temp = 0;
	for(int i = 100;i < 1000;i++){
	    int a = i / 100;  //获取百位数字
	    int b = (i/10)%10;  //获取十位数字
	    int c = i%10;  //获取个位数字
	    if(a+b+c == 5){
	        System.out.print(i+" ");
	        count ++;   //统计一共有多少个满足条件的个数
	        if(++temp % 10 == 0) {  //每十个输出一行
	        	System.out.println();
	        }
	    }
	}
	for(int i = 1001; i < 10000;i ++){
	    int a = i / 1000;  //获取千位数字
	    int b = (i / 100) % 10;  //获取百位数字
	    int c = (i / 10) % 10;  //获取十位数字
	    int d = i % 10;  //获取个位数字
	    if(a+b+c+d == 5){
	    	System.out.print(i+" ");
	        count ++;
	        if(++temp % 10 == 0) {
	        	System.out.println();
	        }
	    }
	}
	for(int i = 10001;i < 50000;i ++){
	    int a = i / 10000;
	    int b = (i / 1000) % 10;
	    int c = (i / 100) % 10;
	    int d = (i / 10) % 10;
	    int e = i % 10;
	    if(a+b+c+d+e == 5){
	    	System.out.print(i+" ");
	        count ++;
	        if(++temp % 10 == 0) {
	        	System.out.println();
	        }
	    }
	}
	System.out.println();
	System.out.println("满足条件的整数一共有"+count+"个");

14.鸡兔同笼

共80个头,208只脚,鸡和兔各有几只

for(int i = 0;i < 80;i ++){
	    for(int k =0;k < 80;k ++){
	        if(i+k == 80 && i*2+k*4 == 208){
	            System.out.println("鸡有:"+i);
	            System.out.println("兔有:"+k);
	        }
	    }
	}
}

15.百鸡百钱

鸡翁一值五钱,鸡母一值钱三,鸡雏三值一钱。百钱买百鸡,问鸡翁、鸡母、鸡雏各有几只?

for (int i = 1; i < 20; i++) {
for (int k = 1; k < 300; k++) {
int j = 100 - i - k;
if (j < 0)
continue;
if (i * 5 + k / 3 + j * 3 == 100) {
System.out.print(i + " ");
System.out.print(k + " ");
System.out.print(j);
System.out.println();
}
}
}

数组章节作业 1、将一个数组中的元素倒排过来,不能新开一个数组的临时存储空 间,只能在原数组上改。 2、写一个类用来模拟栈这种数据结构,要求底层 使用数组存储数据, 并给出相应的进栈和出栈的方法。MyStack int arr[]; int count;//栈中元素个数 public MyStack(int n){ arr = new int[n]; } boolean push(int num){ if(count==arr.length){} arr[count++]=num; } int pop(){ if(count==0){ return -1;} return arr[--count]; } 3、实现在一个数组指定位置添加元素和删除元素的功能。 1、数组容量问题? 2、添加元素前后数组中元素的变化 3、删除元素前后数组中元素的变化 面向对象章节作业 1,写一个类,名为Animal,该类有两个私有属性, name(代表动物的名字),和legs(代表动物的腿的条 数)。并提供个两构造方法,一个无参,默认给name 赋值为AAA,给legs赋值为4;另一个需要两个参数, 分别用这两个参数给私有属性赋值。该类还有两个重载的move()方法,其中一个无参,在屏幕上输出一行文字: XXX Moving!!(XXX为该动物的名字);另一个需要一个int参数n,在屏幕上输出n次 XXX Moving!! 2,写一个类Person,包含以下属性:String name; int age; boolean gender; Person partner。 为Person类写一个marry(Person p)方法,代表当前 对象和p结婚,如若可以结婚,则输出恭贺信息, 否则输出不能结婚原因。要求在另外一个类中写一 个主方法,来测试以上程序。(下列情况不能结婚: 结婚年龄,男<24,女<22;3,某一方已婚) 3,写一个类,名为Animal,该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public 的访问方法。并提个两构造方法,一个无参,默认给name赋值为AAA,给legs赋值为4;另一个需要两个参数,分别用这两个参数给私有属性赋值。要求在第一个构造方法中调用第二个构造方法。该类还有两个重载的move()方法,其中一个无参,在屏幕上输出一行文字: XXX Moving!!(XXX为该动物的名字);另一个需要一个int参数n,在屏幕上输出n次 XXX Moving!! 4,写一个类Fish,继承自Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs赋默认值0;该类还要求覆盖Animal类中的无参move()方法,要求输出:XXX Swimming!! 5,写一个类Bird,继承自Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs赋默认值2;该类还要求覆盖Animal类中的无参move()方法,要求输出:XXX Flying!! 6,写一个类Zoo,要求分别生成若干个Animal,Fish和Bird。并调用他们的属性和方法。 7,写Shape类,要求如下: 1.int类型属性x和y,分别表示图形的中心点坐标 2.无参构造器 3.构造器,对x和y进行初始化 4.draw()方法,输出"Shape draw" 写Circle类,继承Shape类,要求如下 1.double类型属性r,表示圆的半径 2.无参构造器,将r初始化为1.0 3.构造器,对r进行初始化 4.构造器,对x、y、r进行初始化 5.draw()方法,输出"draw in circle"和x,y,r的值 写Rectangle类,继承Shape类,要求如下 1.double类型属性height和width,表示矩形的高和宽 2.无参构造器,将height和width都初始化为1.0 3.构造器,对height和width进行初始化 4.构造器,对x、y、height、width进行初始化 5.draw()方法,输出"draw in rectangle"和x,y,height,width的值 使用ShapeTest类测试以上代码。 8,某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。 SalariedEmployee:Employee的子类,拿固定工资的员工。属性:月薪 HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。属性:每小时的工资、每月工作的小时数 SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。属性:月销售额、提成率 BasedPlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。属性:底薪。 写一个程序,把若干各种类型的员工放在一个Employee数组里,写一个函数,打印出某月每个员工的工资数额。注意:要求把每个类都做成完全封装,不允许非私有化属性。 容器类章节作业 1、写MyStack类,实现栈功能。在类中使用ArrayList保存数据。 2、使用TreeSet和Comparator,写TreeSetTest1 要求:对TreeSet中的元素"HashSet"、"ArrayList"、"TreeMap"、"HashMap"、"TreeSet"、"LinkedList"进行升序和倒序排列 3、使用TreeSet和Comparator,写TreeSetTest2 要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列 4、使用TreeSet和Comparator,写TreeSetTestInner 要求: 对TreeSet中的元素"HashSet"、"ArrayList"、"TreeMap"、"HashMap"、"TreeSet"、"LinkedList"进行升序和倒序排列 1. 使用匿名内部类实现 2. 使用静态内部类实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值