简单数论
1.模运算
模运算相关题目:刷题统计
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,n; // 每天做题数量a、每天做题数量b和总共要做的题目数量n
cin>>a>>b>>n;
long long week=a*5+b*2; // 每周做题数量
long long days=(n/week)*7; // 做题的总天数,通过总题数除以每周题数得到总周数,再乘以一周的天数
n=n%week; // 计算剩余的题目数量,即除去整数周后剩下的题目数量
if(n<=a*5) // 如果剩余题目数量不超过一周内的工作日数量
days=days+n/a+(n%a?1:0); // 则直接计算剩余题目在工作日内所需的天数,每天做题数量可能不均匀,取余为0时不需要额外一天
else{ // 如果剩余题目数量超过一周内的工作日数量
days=days+5; // 先将总天数加上一周的工作日数
n=n-a*5; // 减去一周内的工作日做题数量
days=days+n/b+(n%b?1:0); // 计算剩余题目在休息日内所需的天数,每天做题数量可能不均匀,取余为0时不需要额外一天
}
cout<<days; // 输出总共需要的天数
return 0;
}
2.快速幂
快速幂相关题目:快速幂
#include<bits/stdc++.h>
using namespace std;
// 快速幂算法
// 计算 a 的 n 次方对 mod 取模的结果
long long fastPow(long long a, long long n, long long mod) {
long long ans = 1;
a = a % mod; // 取模,防止下面的 ans * a 越界
while (n) { // 当 n 不为 0 时循环
if (n & 1) // 如果 n 的二进制表示的最低位为 1
ans = (ans * a) % mod; // 将 ans 乘以 a 并对 mod 取模,更新 ans
a = (a * a) % mod; // 将 a 自乘一次并对 mod 取模,更新 a
n >>= 1; // 将 n 右移一位,相当于 n 除以 2
}
return ans; // 返回结果
}
int main() {
long long b, p, k;
cin >> b >> p >> k; // 输入 b, p, k
cout << fastPow(b, p, k); // 输出 fastPow 函数的返回值
return 0;
}
3.GCD,最大公约数
c++福利:直接用--gcd()函数
该函数返回两个数的最大公约数,可以返回负数
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<__gcd(15,81)<<'\n'; //输出3
cout<<__gcd(0,44)<<'\n'; //输出44
cout<<__gcd(0,0)<<'\n'; //输出0
cout<<__gcd(-6,-15)<<'\n'; //输出-1
cout<<__gcd(-17,289)<<'\n'; //输出-17
cout<<__gcd(17,-289)<<'\n'; //输出17
return 0;
}
4.LCM,最小公倍数
int lcm(int a,int b){return a/__gcd(a,b)*b;}//LCM最小公倍数计算代码---背下来!
gcd-最大公约数相关题目:核桃的数量
#include<bits/stdc++.h>
using namespace std;
int lcm(int a,int b){return a/__gcd(a,b)*b;}//LCM最小公倍数计算---背下来!
//计算三个数的最小公倍数
int main(){
int a,b,c;
cin>>a>>b>>c;
int k=lcm(a,b);
cout<<lcm(k,c)<<endl;
return 0;
}
题目:最大最小公倍数
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n, ans;
cin >> n;
if(n <= 2)
ans = n;
else if(n%2)
ans=n*(n-1)*(n-2); //n是奇数
else {//是偶数
if(n%3)
ans = n*(n-1)*(n-3);//n没有因数3
else ans =(n-1)*(n-2) * (n-3);//n有因数3
}
cout << ans;
return 0;
}
这段代码根据输入的数n计算出一个结果ans。如果n小于等于2,则结果为n;如果n是奇数,则结果为n*(n-1)(n-2);如果n是偶数,则结果为n(n-1)(n-3)或(n-1)(n-2)*(n-3),具体取决于n除以3的余数。
5.素数的判断
试除法判断素数题目:判断29是不是素数
#include<bits/stdc++.h>
using namespace std;
bool is_prime(long long n){
if(n <= 1)
return false;//1不是素数
for(long long i=2;i*i<= n; i++)
if(n%i==0)
return false;// 能整除,不是素数
return true;//全不能整除,是素数
}
int main(){
long long number=29;// 例子:要检查是否为素数的数值
if(is_prime(number))
cout<<number<<"是素数。"<<endl;
else
cout<<number<<"不是素数。"<<endl;
return 0;
}
6.题目:分解质因数
#include<bits/stdc++.h>
using namespace std;
int p[20]; //p[]记录因子,p[1]是最小因子。一个int数的质因子最多有10几个
int c[40]; //c[i]记录第1个因子的个数。一个因子的个数最多有30几个
// 计算一个整数的质因子,并返回质因子个数
int factor(int n){
int m=0;// m用于记录质因子的个数
for(int i=2;i*i<= n;i++)
if(n%i==0){
// 如果能整除,则i是n的一个质因子,记录质因子
p[++m]=i;
// 初始化质因子计数器
c[m]=0;
// 把n中重复的因子去掉,记录质因子个数
while(n%i==0){
n=n/i;
c[m]++;
}
}
// 如果n大于1,说明还有一个质因子没有被除尽,即n本身就是一个素数
if(n>1){
// 记录这个质因子
p[++m]=n;
// 记录质因子个数为1
c[m]=1;
}
// 返回质因子个数
return m;
}
int main(){
int a,b;
cin>>a>>b;// 输入范围上下界
for(int i=a;i<=b;i++){
// 计算i的质因子个数
int m= factor(i);
// 输出当前数
cout<<i<<"=";
// 遍历每个质因子
for(int j=1;j<=m;j++){ //第j个因子
// 遍历当前质因子的个数
for(int k=1;k<=c[j];k++){//第j个因子的个数
// 输出当前质因子
cout<<p[j];
// 如果不是最后一个质因子,输出乘号
if(k<c[j]) cout <<"*";
}
// 如果不是最后一个质因子,输出乘号
if(j<m) cout <<"*";
}
// 输出换行
cout<<endl;
}
return 0;
}