栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++刷题中的数学问题(公因数、公倍数、质数等)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++刷题中的数学问题(公因数、公倍数、质数等)

公倍数和公因数

利用辗转相除法,我们可以很方便地求得两个数的最大公因数(greatest common divisor,gcd);将两个数相乘再除以最大公因数即可得到最小公倍数(least common multiple, lcm)。

int gcd(int a, int b) {
	return b == 0 ? a : gcd(b, a% b);
}
int lcm(int a, int b) {
	return a * b / gcd(a, b);
}

进一步地,我们也可以通过扩展欧几里得算法(extended gcd)在求得 a 和 b 最大公因数的同时,也得到它们的系数 x 和 y,从而使 ax + by = gcd(a, b)。

int xGCD(int a, int b, int &x, int &y) {
	if (!b) {
		x = 1, y = 0;
		return a;
	}
	int x1, y1, gcd = xGCD(b, a % b, x1, y1);
	x = y1, y = x1 - (a / b) * y1;
	return gcd;
}
质数 204.计数质数

题目描述

给定一个数字 n,求小于 n 的质数的个数。

输入输出样例

输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

题解
埃拉托斯特尼筛法(Sieve of Eratosthenes,简称埃氏筛法)是非常常用的,判断一个整数是否是质数的方法。并且它可以在判断一个整数 n 时,同时判断所小于 n 的整数,因此非常适合这道题。其原理也十分易懂:从 1 到 n 遍历,假设当前遍历到 m,则把所有小于 n 的、且是 m 的倍数的整数标为和数;遍历完成后,没有被标为和数的数字即为质数。

代码

class Solution {
public:
    int countPrimes(int n) {
        vector isPrime(n, 1);
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i]) {
                ans += 1;
                if ((long long)i * i < n) {
                    for (int j = i * i; j < n; j += i) {
                        isPrime[j] = 0;
                    }
                }
            }
        }
        return ans;
    }
};

数字处理 504.七进制数

题目描述

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

输入输出样例

输入: num = 100
输出: "202"

代码

class Solution {
public:
    string convertTobase7(int num) {
        if(num==0) return "0";
        bool is_negative=num<0;
        if(is_negative) num=-num;
        string ans;
        while(num){
            int a=num/7,b=num%7;
            ans=to_string(b)+ans;
            num=a;
        }
        return is_negative?"-"+ans:ans;
    }
};
172.阶乘后的零

题目描述

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1

输入输出样例

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

题解

每个尾部的 0 由 2 × 5 = 10 而来,因此我们可以把阶乘的每一个元素拆成质数相乘,统计有多少个 2 和 5。明显的,质因子 2 的数量远多于质因子 5 的数量,因此我们可以只统计阶乘结果里有多少个质因子 5。

代码

class Solution {
public:
    int trailingZeroes(int n) {
        return n==0?0:n/5+trailingZeroes(n/5);
    }
};
326.3的幂

题目描述

判断一个数字是否是 3 的次方。

输入输出样例

输入:n = 27
输出:true

代码

利用对数

class Solution {
public:
    bool isPowerOfThree(int n) {
        return fmod(log10(n) / log10(3), 1) == 0;
    }
};

因为在 int 范围内 3 的最大次方是 1162261467,如果 n 是 3 的整数次方,那么 1162261467 除以 n 的余数一定是零;

class Solution {
public:
    bool isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号