这个暑假,在有一点点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);
//能执行到此处的都是质数,直接打印
}
}
}