蓝桥杯c++b组练习题自用记录9

简单数论

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值