Java入门小算法强化基础知识----循环结构

这个暑假,在有一点点C语言基础上开始学习Java,记录一下学习过程中用来强化基础知识的简单算法。

1.求两个数的最大公约数和最小公倍数

思路:
1.最大公约数:~肯定不会大于两数中的小数,且最小为1(终止条件)从小的数开始递减,能整除且无余数(求余),找到一个共同的约数就是最大公约数。
2.最小公倍数:~肯定不会小于两数中的大数,且最大为两数的乘积(终止条件)从大的数开始递增,找到一个共同的倍数就是最小公倍数。

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个数:");
		int x = scanner.nextInt();
		System.out.println("请输入第二个数");
		int y = scanner.nextInt();
	    
		int min = (x>=y)?y:x;
		
		for (int i = min; i >= 1; i--) {
			if (x % i == 0 && y % i == 0) {
				System.out.println("两数的最大公约数为:" + i);
				break;//得到第一个就跳出
			}
		}
		
		int max = (x>=y)?x:y;
		for (int i =max; i < x * y; i++) {
			if (i % x == 0 && i % y == 0) {
				System.out.println("两数的最小公倍数为:" + i);
				break;
			}
		}
	}
}

2.求所有的水仙花数

先要知道水仙花数的定义:它是一个三位数,各个位置上的立方和为本身。

思路:
一个简单的for循环就能解决问题,关键是分离出各位上的数。

public class Test {
	public static void main(String[] args) {
			System.out.println("所有的水仙花数为:");
			for (int i = 100; i < 1000; i++) {
				int a = i / 100;//分离百位
				int b = (i % 100) / 10;//分离十位
				int c = i % 10;//分离个位

				if (i == a*a*a+b*b*b+c*c*c) {
					System.out.println(i);
				}
			}
	}
}

3.从键盘输入不确定个数的数,判断读入的正负数的个数,输入0结束程序

思路:
循环次数不确定的,这时候考虑while或do-while。新知识: 跳出循环不一定是不满足条件,合理使用break也可以,有的情况下能提高效率。

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {			
			Scanner scanner = new Scanner(System.in);
			int countPositive=0;
			int countNegative=0;
			System.out.println("请输入一些正数或复数,如输入0则程序停止");
			
			//for(;;)等价于while(true)
			while(true) {				
				int a = scanner.nextInt();
				if (a > 0) {
					countPositive++;
				}else if (a < 0) {
					countNegative++;
				}else {
					System.out.println("over");
					break;
				}
			}
			System.out.println("正数的个数为:"+countPositive);
			System.out.println("负数的个数为:"+countNegative);
	}
}

4.打印菱形

和网上其他的打印菱形略有不同,这里采用的是下面这种方式,与用 * 输出菱形在循环处有差异,但意思差不多。

请输入一个数用来打印菱形
5
    1
   222
  33333
 4444444
555555555
 4444444
  33333
   222
    1

思路:
先确定空格的个数,再确定数字的个数,特别注意换行在循环中的位置,合理运用print()println().

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {
			
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入一个数用来打印菱形");
			int x = scanner.nextInt();
			
			for (int i = 1; i <= x; i++) {
				for (int j = 1; j <= x - i; j++) {
					//打印占位空格
					System.out.print(" ");
				}
				for (int j = 1; j <= 2 * i -1; j++) {
					//打印数字
					System.out.print(i);
				}
				System.out.println();
			}
			//打印倒三角
			for (int i = x-1; i > 0; i--) {
				for (int j = 1; j <= x-i; j++) {
					System.out.print(" ");
				}
				for (int j = 1; j <= i*2-1; j++) {
					System.out.print(i);
				}
				System.out.println();
			}
	}
}

5.求100以内的质数

思路:
用嵌套的for循环,外层遍历1-100以内的数,内层用来逐个试验这个数是否存在除1和自身的约数。

方法一:使用break

public class Test {
	public static void main(String[] args) {
			for (int i = 1; i < 100; i++) {
				boolean flag = true;
				
				//for (int j = 2; j < i; j++) {
				for (int j = 2; j <= Math.sqrt(i); j++) {
		//优化二:直接判断平方根,针对质数,想不通就用上面的
					if (i%j==0) {
						flag=false;
						break;
		//优化一:用break跳出大循环,进行下一个i的判断,针对非质数
					}	
				}
				if (flag) {
					System.out.println(i);
				}
			}
	}
}

方法二:使用continue和lable

package test;

public class Test {

	public static void main(String[] args) {	
			lable:for (int i = 1; i < 100; i++) {
				for (int j = 2; j <= Math.sqrt(i); j++) { 
					if (i%j==0) {
						continue lable;//优化1:跳出大循环 
					}	
				}
					System.out.println(i);
					//能执行到此处的都是质数,直接打印
			}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值