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

编程入门 行业动态 更新时间:2024-10-09 21:20:13

C/C++刷题中的数学问题(<a href=https://www.elefans.com/category/jswz/34/1737775.html style=公因数、公倍数、质数等)"/>

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

更多推荐

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

本文发布于:2023-07-28 19:12:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1284033.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:公因数   公倍数   质数   数学   刷题中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!