数学知识----约数

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

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

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

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



相关文章
|
6月前
|
算法
算法每日一题---两数之和
算法每日一题---两数之和
29 0
|
6月前
|
存储 索引
题目----LeeCode热题100--1 两数之和
题目----LeeCode热题100--1 两数之和
41 1
|
人工智能
求解最大公约数----最小公倍数
最大公因数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。最小公倍数的计算要把三个数的公有质因数和独有质因数都要找全,最后除到两两互质为止。
78 0
|
机器学习/深度学习 算法 C++
算法基础系列第四章——数论之质数与约数(1)
算法基础系列第四章——数论之质数与约数(1)
181 0
算法基础系列第四章——数论之质数与约数(1)
|
算法 C++
算法基础系列第四章——数论之质数与约数(2)
算法基础系列第四章——数论之质数与约数(2)
119 0
算法基础系列第四章——数论之质数与约数(2)
|
算法
算法题每日一练---第60天:快速幂
快速幂是一种简单而有效的小算法。
172 15
算法题每日一练---第60天:快速幂
三个袋子----数论推导
题目描述 平平在公园里游玩时捡到了很多小球,而且每个球都不一样。平平找遍了全身只发现了3个一模一样的袋子。他打算把这些小球都装进袋子里(袋子可以为空)。他想知道他总共有多少种放法。 将N个不同的球放到3个相同的袋子里,求放球的方案总数M。 结果可能很大,我们仅要求输出M mod K的结果。 现在,平平已经统计出了N<=10的所有情况。
113 0
三个袋子----数论推导