数学知识----约数

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

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

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

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 / 最大公约数



相关文章
|
2天前
|
存储 算法
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
34 1
|
2天前
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
24 0
|
2天前
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
【每日一题Day126】LC1140石子游戏Ⅱ | 博弈dp 记忆化搜索
31 0
|
11月前
剑指offer_发散思维---数值的整数次方
剑指offer_发散思维---数值的整数次方
47 0
|
人工智能
求解最大公约数----最小公倍数
最大公因数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。最小公倍数的计算要把三个数的公有质因数和独有质因数都要找全,最后除到两两互质为止。
51 0
|
人工智能
|
算法 索引
杨辉三角Ⅱ
杨辉三角Ⅱ
|
算法
动态规划---数字三角形模型(一)
AcWing算法提高课内容,本文讲解 动态规划
96 0
动态规划---数字三角形模型(一)