lesson3:java基础系列一些小题目

本文介绍如何通过编程求解100以内的素数及100到999之间的水仙花数,同时展示了冒泡排序算法的实现过程,包括优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.素数问题:

求100以内的素数?

 

解:首先了解什么是素数:比1大的整数中,如果除了1和它本身以外,不能被其他正整数整除,就叫素数(质数)。

思路:先设计一个任意数的是否是素数的方法:这里我用for循环先求下6是否是素数,请看代码:

		boolean flag = false;
		int m=6;
		for (int i = 2; i <= 6/2; i++) {
			if(m%i==0) 
			{
				System.out.println(m+"不是质数(素数)");
				flag=true;
				break;
			}
			
		} 
		
		if (!flag) {
			System.out.println(m+ "是质数(素数)");
		}

在for循环中判断 如果6模上,6以内且大于2的数为0则是素数,直接break循环,注意这里设计for循环的终止条件为6/2,是因为如果一个数得除数大于它的1/2,就不会被整除了,这样后面的循环就没有必要再进行下去。好了一次判断结束了,在求100以内的就好算了,只需要在外面在加成循环就ok了,请看代码:

	for (int j = 2; j <= 100; j++) {
			boolean flag = false;

			for (int i = 2; i <= j / 2; i++) {
				if (j % i == 0) {
					System.out.println(j + "不是质数(素数)");
					flag = true;
					break;
				}

			}

			if (!flag) {
				System.out.println(j + "是质数(素数)");
			}
		}

 

2.水仙花:100到999之间的水仙花数

 

解:首先,了解下什么是水仙花,所谓水仙花数就是一个任意位数,它各位的立方之和加起来的数值等于本身,比如说,153,153 = 1 + 125 + 27 ;这题求的是1000以内,所以就先求各个位置的数了,那怎么求呢,请看代码:

	     int i=153; 
		int	a=(i%100)/10; //十位
		int	b=i%10;   //个位
		int	c=i/100;  //百位
		System.out.println("a="+a+",b"+b+",c="+c);

然后在去求这个三个位置上的立方的和是否等于这个数本身:请看代码:

		
		int m=0;
		for(int i=100;i<1000;i++) {
			int	a=(i%100)/10; //十位
			int	b=i%10;   //个位
			int	c=i/100;  //百位
			if((int)(Math.pow(a, 3)+Math.pow(b, 3)+Math.pow(c, 3))==i) {
				System.out.println(i+"是水仙花");
				m++;
			}
		}
		
		System.out.println("水仙花数为"+m+"个!");

 

打印出结果为:

153是水仙花
370是水仙花
371是水仙花
407是水仙花
水仙花数为4个!

 

 

3.手写的冒泡排序法:

解:

原理:比较两个相邻的元素,将值大的元素交换至右端。

比如说一个数组里面存了5个int 类型的数,我们先做一次相邻的数比较,请看代码:

	    int a[]= {1,3,2,5,4};
		

		for (int i = 0; i < a.length-1; i++) {
			
			if(a[i]>a[i+1]) {//此时需交换 
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
				int m=a[i+1];
				a[i+1]=a[i];
				a[i]=m;
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
			}
		}
		

 

这是做了一次,把最大的数冒泡到最右端的,其他的依次类推,只要在外层加层循环就可以了,请看代码:

 

		int a[]= {1,3,2,5,4};
		
		for (int j = 0; j < a.length-1; j++) {
	

			for (int i = 0; i < a.length-1; i++) {
			
				if(a[i]>a[i+1]) {//此时需交换 
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
				int m=a[i+1];
				a[i+1]=a[i];
				a[i]=m;
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
				}
			}

		}
		System.out.println(Arrays.toString(a));

 

最后我们打印出结果为:

a[1]3,a[2]2
a[1]2,a[2]3
a[3]5,a[4]4
a[3]4,a[4]5
[1, 2, 3, 4, 5],完美解决了,其实这个代码还是可以优化下,比如说我们在内存循环的时候,并不需要每次循环到最后一个数,比如我们第二次循环时只需要比较前面4个数,除此之外,如果我们可以加一个变量,在做第一次比较时,如果没有必要冒泡,就直接退出循环。所以最终代码为:

		
		int a[]= {1,3,2,5,4};
		
		for (int j = 0; j < a.length-1; j++) {
	
			boolean flag = false;
			for (int i = 0; i < a.length-1-j; i++) {
			
				if(a[i]>a[i+1]) {//此时需交换 
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
				int m=a[i+1];
				a[i+1]=a[i];
				a[i]=m;
				System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
				flag=true;
				}
			}
			if(!flag) {
				break;
			}
		}
		System.out.println(Arrays.toString(a));

	}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值