数学知识----约数

简介: 数学知识----约数

试除法求一个数的所有约数

与试除法求一个数的所有质数类似

package luogu.数学知识.约数;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class 试除法求一个数的所有约数 {
    static List<Integer> ans = new ArrayList<>();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        getDivisors(n);
        //对约数进行从小到大排序
        ans.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });
        for ( int i=0; i<ans.size(); i++ ) {
            System.out.println( ans.get(i) );
        }
    }
    public static void getDivisors( int n ) {
        for ( int i=1; i<=n/i; i++ ) {
            if ( n%i==0 ) {
                ans.add(i);
                //除去相同的除数
                if ( n/i!=i ) ans.add(n/i);
            }
        }
    }
}

约数的个数

每个数的指数取0时,该数为1,当所有数的指数为0时,这个约数为1,所以枚举从2开始枚举,如果从一开始会进入无限循环

package luogu.数学知识.约数;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 约数的个数 {
    //记录可以整除 N 的数的个数
    static Map<Integer, Integer> ans = new HashMap<>();//记录每个数的个数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        getDivisor(n);
        //计数
        int res = 1;
        for (Integer integer :ans.keySet()) {
            res = res*(ans.get(integer)+1);
        }
        System.out.println( res );
    }
    public static void getDivisor( int n ) {
        for ( int i=2; i<n/i; i++ ) {
            while( n%i==0 ) {
                if ( ans.containsKey(i) ) ans.put(i, ans.get(i)+1);
                else ans.put(i, 1);
                n /= i;
            }
        }
        if ( n>1 ) { //判断是否还有剩余
            if ( ans.containsKey(n) ) ans.put(n, ans.get(n)+1);
            else ans.put(n, 1);
        }
    }

约数之和

package luogu.数学知识.约数;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 约数之和 {
    //记录可以整除 N 的数的个数
    static Map<Integer, Integer> ans = new HashMap<>();//记录每个数的个数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        getDivisor(n);
        int res = divisorSum();//计算约数之和
        System.out.println( res );
    }
    //得到 n 的约数
    public static void getDivisor( int n ) {
        for ( int i=2; i<n/i; i++ ) {
            while( n%i==0 ) {
                if ( ans.containsKey(i) ) ans.put(i, ans.get(i)+1);
                else ans.put(i, 1);
                n /= i;
            }
        }
        if ( n>1 ) { //判断是否还有剩余
            if ( ans.containsKey(n) ) ans.put(n, ans.get(n)+1);
            else ans.put(n, 1);
        }
    }
    //计算约数之和
    public static int divisorSum() {
        int res = 1;//保存结果
        //遍历 map
        for ( Integer i : ans.keySet() ) {
            int sum_i = 1;
            for ( int j=1; j<=ans.get(i); j++ ) {
                sum_i += Math.pow( i, j );
            }
            res *= sum_i;
        }
        return res;
    }
}

欧几里得算法(辗转相除法)–求最大公约数

package luogu.数学知识.约数;
import java.util.Scanner;
public class 最大公约数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int ans = gcd( a, b );
        System.out.println(ans);
    }
    //求 a,b 的最大公约数
    public static int gcd( int a, int b ) {
        //当b==0时,此时的a为最大公约数
        //b大于0 继续递归求解
        return b>0 ? gcd(b, a%b) : a;
    }
}

最小公倍数

例如,要求 a,b 的最大公约数和最小公倍数

a*b = 最大公约数 * 最小公倍数

所以,最小公倍数 = a*b / 最大公约数



相关文章
|
7月前
|
存储 算法
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
61 1
|
7月前
|
算法
算法每日一题---两数之和
算法每日一题---两数之和
30 0
|
7月前
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
46 0
数学知识-约数
数学知识-约数
|
人工智能
求解最大公约数----最小公倍数
最大公因数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。最小公倍数的计算要把三个数的公有质因数和独有质因数都要找全,最后除到两两互质为止。
83 0
|
人工智能
凑算式---蓝桥杯
凑算式---蓝桥杯
凑算式---蓝桥杯
|
算法 C++
数学知识:约数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:约数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
135 0
数学知识:约数(一)