Rumah  >  Artikel  >  Java  >  Analisis contoh sintaks Java

Analisis contoh sintaks Java

PHPz
PHPzke hadapan
2023-05-16 19:28:131035semak imbas

1. N jenis penyelesaian nombor perdana

1.1, penyelesaian gelung ganas

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 + "是素数!");
            }
        }
    }
}

1.2, cuba bahagikan separuh pertama nombor

rreee

Anda boleh mendapati bahawa kita tidak mempunyai nombor Ia boleh dibahagikan kepada pendaraban dua nombor, seperti 16: ia boleh menjadi 1 16, 2 * 8, 4 * 4. Anda boleh melihat bahawa separuh pertama nombor adalah kurang daripada separuh itu sendiri, jadi kita hanya perlu mengesan ini Bolehkah separuh pertama nombor itu boleh dibahagi dengan sendirinya Kerana selagi ada satu pada separuh pertama, mesti ada nombor pada separuh kedua yang boleh didarab dengan sendirinya? dapatkan sendiri, jadi ini mengurangkan separuh beban kerja. *

1.3, cuba bahagikan nombor yang lebih kecil daripada tanda akarnya

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 + "是素数!");
            }
        }
    }
}

Ia masih prinsip yang sama seperti sebelum ini, tetapi julatnya disempitkan lagi, kerana nombor dibahagikan kepada hasil darab dua nombor Dalam bentuk Melihat bahawa adalah mustahil untuk nombor tertentu didarab dengan nombor lain untuk sama dengan 16, sudah tentu 2 * 8, 8 * 2 hanya boleh dianggap sebagai yang pertama

1.4 , cari nombor ganjil

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 + "是素数!");
            }
        }
    }
}

Kita tahu bahawa, kecuali untuk kes khas 2, semua nombor genap tidak boleh menjadi nombor perdana, kerana mereka sekurang-kurangnya boleh dibahagikan dengan 2, jadi apabila mempertimbangkan dalam julat, kita hanya perlu mengesan nombor ganjil Kurangkan bilangan gelung luar.

Malah, ada cara untuk terus mengoptimumkan semuanya di sini. Jika anda berminat, anda boleh menyemaknya. Banyak blogger telah menulis artikel yang sangat terperinci dan mendalam.

Kedua, masalah tahun lompat

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 + "是素数!");
            }
        }
    }
}

Di sini anda hanya perlu mengetahui kriteria penghakiman untuk tahun lompat untuk menyelesaikan masalah dengan baik.

Tiga, cari pembahagi sepunya terbesar dan gandaan sepunya terkecil

3.1, cari pembahagi sepunya terbesar

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 + "不是闰年!");
        }
    }
}

3.2, cari gandaan sepunya terkecil

rreee

Malah, terdapat satu lagi Formula, dengan mengandaikan bahawa pembahagi sepunya terbesar ialah m, maka gandaan sepunya terkecil ialah (a*b)/m.

Keempat, masalah pengeksponenan diri

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);
    }
}

Kelima, mengira bilangan 1 dalam bit binari

5.1, anjakan bulat ke kanan bitwise DAN 1

rreee

Nota: Terdapat pepijat dalam kod ini, kerana nombor negatif tidak boleh dikira Bit tanda tertinggi bagi sistem binari nombor negatif ialah 1. Jika anda beralih ke kanan untuk melengkapkan bit tanda, anda akan sentiasa menambah 1 kepada. bit tinggi, dan gelung akan menjadi tidak berkesudahan.

Penyelesaian: num = num >> 1 ——> Tukar kepada num = num >>> 0. Berlaku untuk kedua-dua nombor positif dan negatif.

Peluasan: Sesetengah orang mungkin bertanya, memandangkan anda boleh bergerak ke kanan, mengapa anda tidak boleh bergerak ke kiri?

Jawapannya ialah: Memang boleh beralih ke kiri, tetapi tidak digalakkan kerana kecekapannya terlalu rendah.

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;
            }
        }
    }
}

Pada masa ini, daripada mengalihkan nombor ke kiri, kita beralih 1 ke kiri, dan kemudian melakukan bitwise DAN dengan nombor itu, kerana hasilnya hanya boleh 0 atau bukan 0, bukan -0 Ini bermakna kedudukan 1 dalam hasil peralihan 1 ke kiri sepadan dengan kedudukan nombor ini, jadi kami akan mengiranya pada masa ini. Walaupun kaedah ini juga boleh menyelesaikan masalah, anda perlu beralih ke kiri 32 kali kerana anda tidak mempunyai cara untuk mengetahui berapa banyak 1 yang ada di hadapan nombor ini dan hanya boleh membandingkan semua bit.

5.2, prinsip n & (n-1) menghapuskan 1

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 + "不是自幂数!");
        }
    }
}

Kaedah ini boleh digunakan untuk nombor positif dan negatif, dan ia sangat cekap, bitwise dan num-1 sekali setiap kali , 1 akan dihapuskan.

Pelanjutan: Gunakan kaedah ini untuk menentukan sama ada nombor tertentu adalah 2 dinaikkan kepada kuasa kth.

rreeee

Atas ialah kandungan terperinci Analisis contoh sintaks Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam