public class TestDemo220427 { public static void main(String[] args) { // 这里以求取1~100之间的素数为例 for(int i = 2;i <= 100;i++){//素数从2开始,所以从2开始产生到100的数 int flg = 1;//假设是素数 for(int j = 2;j < i;j++){ if(i%j == 0){ flg = 0; } } if(flg == 1){ System.out.println(i + "是素数!"); } } } }
public class TestDemo220427 { public static void main(String[] args) { // 这里以求取1~100之间的素数为例 for(int i = 2;i <= 100;i++){//素数从2开始,所以从2开始产生到100的数 int flg = 1;//假设是素数 for(int j = 2;j < i/2;j++){ if(i%j == 0){ flg = 0; } } if(flg == 1){ System.out.println(i + "是素数!"); } } } }
우리 숫자 중 하나가 2의 곱셈으로 나누어지는 것을 알 수 있습니다. 16과 같은 숫자: 1 16, 2*8, 4*4가 될 수 있습니다. 숫자의 앞부분이 자신의 절반보다 작다는 것을 알 수 있으므로 숫자의 앞부분만 확인하면 됩니다. 왜냐하면 전반부가 있는 한 후반부에 자기 자신을 얻기 위해 곱할 수 있는 숫자가 있어야 하므로 작업량이 절반으로 줄어들기 때문입니다. *
import java.lang.Math; public class TestDemo220427 { public static void main(String[] args) { // 这里以求取1~100之间的素数为例 for(int i = 2;i <= 100;i++){//素数从2开始,所以从2开始产生到100的数 int flg = 1;//假设是素数 for(int j = 2;j <= (int)(Math.sqrt(i));j++){ if(i%j == 0){ flg = 0; } } if(flg == 1){ System.out.println(i + "是素数!"); } } } }
여전히 이전과 같은 원리이지만, 두 수의 곱의 형태로 수를 나누면 다시 범위가 좁아집니다. , 이전 숫자는 자신의 절반보다 작을 뿐만 아니라 16과 같이 제곱근 값보다 클 수 없습니다. 실제로 숫자의 전반부는 4보다 크지 않습니다. 4보다 크면 특정 숫자가 있을 수 없음을 알 수 있습니다. 숫자를 다른 숫자로 곱하면 16이 될 수 있습니다. 물론 2*8과 8*2는 전자의 숫자로만 간주될 수 있습니다. 1.4, 홀수에서
import java.lang.Math; public class TestDemo220427 { public static void main(String[] args) { // 这里以求取1~100之间的素数为例 for(int i = 1;i <= 100;i += 2){//从1开始,产生到100的奇数 int flg = 1;//假设是素数 if(i == 1){ System.out.println((i+1) + "是素数!");//2这里需要单拎出来考虑,比较特殊 continue; } for(int j = 2;j <= (int)(Math.sqrt(i));j++){ if(i%j == 0){ flg = 0; } } if(flg == 1){ System.out.println(i + "是素数!"); } } } }
실제로 계속해서 최적화할 수 있는 방법이 있기 때문에 여기에 모두 나열하지는 않겠습니다. 관심이 있으신 분들은 많은 블로거들이 매우 상세하고 깊이 있는 글을 작성해 주셨으니 확인해 보세요!
둘째, 윤년 문제
public class TestDemo220427 { public static boolean isleapYear(int year){ if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){ return true; } else{ return false; } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入年份:"); int year = scan.nextInt(); boolean ret = isleapYear(year); if(ret == true){ System.out.println(year + "是闰年!"); }else{ System.out.println(year + "不是闰年!"); } } }
셋, 최대공약수와 최소공배수를 구하세요
import java.util.Scanner; public class TestDemo220427 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = scan.nextInt(); int b = scan.nextInt(); int m = 0; while((m = a%b) != 0){//辗转相除法 a = b; b = m; } System.out.println(b); } }
import java.util.Scanner; public class TestDemo220427 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = scan.nextInt(); int b = scan.nextInt(); for(int i = 1;i > 0;i++){ if((a*i)%b == 0){ System.out.println("最小公倍数:" + a*i); break; } } } }
넷째, 자기 지수화 문제
import java.lang.Math; public class TestDemo220427 { public static boolean isNarnum(int num,int count){ int sum = 0; int tmp = num; while(tmp != 0){ sum += Math.pow(tmp%10,count); tmp /= 10; } if(sum == num){ return true; }else{ return false; } } public static void main(String[] args) { // 判断一个数是不是自幂数 Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); int count = 0; int tmp = num; while(tmp != 0){ count++; tmp /= 10; } boolean ret = isNarnum(num,count); if(ret == true){ System.out.println(num + "是一个" + count +"位自幂数!"); }else{ System.out.println(num + "不是自幂数!"); } } }
import java.util.Scanner; public class TestDemo220427 { public static int getOnecount(int num){ int count = 0; while(num != 0){//右移后不为0就继续统计 if((num& 1) == 1){ count++; } num = num >> 1; } return count; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); int ret = getOnecount(num); System.out.println(num + "的二进制位中1的个数 :" + ret); } }
해결책: num = num >> 1 ——> num = num >>> 1로 변경하여 양수인 경우 상위 비트가 0으로 채워지도록 합니다. 및 음수 모두 적용 가능합니다.
확장: 어떤 사람들은 오른쪽으로 이동할 수 있는데 왜 왼쪽으로 이동할 수 없냐고 물을 수도 있습니다.
정답은: 왼쪽으로 이동하는 것은 실제로 가능하지만 효율성이 너무 낮기 때문에 권장하지 않습니다.
public class TestDemo220427 { public static int getOnecount(int num){ int count = 0; for(int i = 0;i < 32;i++){ if((num & (1 << i)) != 0){ count++; } } return count; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); int ret = getOnecount(num); System.out.println(num + "的二进制位中1的个数 :" + ret); } }
이때 숫자를 왼쪽으로 이동하는 대신 1을 왼쪽으로 이동한 다음 숫자와 비트 단위 AND를 수행합니다. 결과는 0 또는 0이 아닌 것만 가능하고 0이 아닌 것은 다음을 의미하기 때문입니다. 이동된 결과에서 1의 위치는 1의 위치에 해당하므로 이번에는 이를 계산해 보겠습니다. 이 방법으로 문제를 해결할 수도 있지만 왼쪽으로 32번 이동해야 합니다. 왜냐하면 이 숫자 앞에 1이 몇 개 있는지 알 수 없고 모든 비트만 비교할 수 있기 때문입니다.
5.2, 1을 제거하는 n & (n-1)의 원리
import java.util.Scanner; public class TestDemo220427 { public static int getOnecount(int num){ int count = 0; while(num != 0){ num = num&(num-1); count++; } return count; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个数:"); int num = scan.nextInt(); int ret = getOnecount(num); System.out.println(num + "的二进制位中1的个数 :" + ret); }
확장: 이 방법을 사용하여 특정 숫자가 2의 k승인지 확인합니다.
아아아아위 내용은 Java 구문 예제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!