蓝桥杯常用算法——数学函数

数学库函数

头文件
1.abs(x):求整数的绝对值。
2.fabs(x): 求浮点数的绝对值。
3.sqrt(x):求x的平方根。
4.pow(x,y):求x的y次方。
5.ceil(x):求不小于x的最小整数。
6.floor(x):求不大于x的最大整数。
7.log(x):求x的自然对数。
8.log10(x):求以十为底x的对数。
9.sin(x):求x的正弦。
10.cos(x):求x的余弦

求素数

方法一:
时间复杂度为O(n)

bool IsPrime(int x)
{
 if(x <= 1)
  return false;
 for(int i = 2;i < x; ++i)
  if(x % i == 0 )
   return false;
 return true;
}

方法二:
时间复杂度为O(n^1/2)

bool IsPrime(int x)
{
 int k=sqrt(x);
 if(x <= 1)
  return false;
 for(int i = 2;i <= k; ++i)
  if(x % i == 0 )
   return false;
 return true;
}

筛法求素数

时间复杂度为O(n)

//求1000000以内的素数
#include<iostream>
using namespace std;
const int MAX_NUM=1000000+10;
bool prime[MAX_NUM];
int main(){
 prime[2]=true;
 for(int i=3;i<MAX_NUM;i+=2){
  prime[i]=true;
 }
 for(int i=3;i<MAX_NUM;++i){
  if(prime[i]){
   for(int j=2*i;j<MAX_NUM;j+=i){
    prime[j]=false;
   }
  }
 }
 for(int i=0;i<MAX_NUM;++i){
  if(prime[i])
   cout<<i<<" ";
 }
 return 0;
} 

欧拉筛法求素数

/*使用欧拉筛法求小于等于n的素数的个数*/
#include<iostream> 
using namespace std;
int prime[10000001]={0};//存素数 
bool vis[100000001]={0};//保证不做素数的倍数 
int main()
{
    int n, cnt = 0;
    cin>>n;
   for(int i = 2; i <= n; i++){
        if(!vis[i])//不是目前找到的素数的倍数 
         prime[cnt++] = i;//找到素数
        for(int j = 0; j<cnt && i*prime[j]<=n; j++){
            vis[i*prime[j]] = true;//找到的素数的倍数不访问 
            if(i%prime[j]==0){
             break;
   } 
  }
    }
    cout<<cnt<<endl;
    
    return 0;
}

求最大公因数

  1. 辗转相除法(欧几里得算法)
//求a和b的最大公因数
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

质因数分解

定义:把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫分解质因数。
分解对象:合数

//将一个数n分解为若干个从小到大排序的质因数的积 
#include<iostream>
#include<cmath>
using namespace std;
int main() {
 int n,m;
 cin>>n;
 m=n;
 cout<<n<<"=";
 if(n<2)
  return 0;
 for(int i=2;i*i<=m;++i){//i=i%2==0?i+2:i+1
  while(m%i==0){
   m/=i;
   cout<<i;
   if(m!=1){
    cout<<"*";
   }
  }
 }  
 if(m!=1){
  cout<<m;
 }
 return 0;
}

运行结果:
在这里插入图片描述

第二大整数

#include<iostream>
using namespace std;
int main()
{
 int x;
 int max=-1000000,mbx=-1000000;
 while((cin>>x)&&x!=0){
  if(mbx<=x){
   if(max<x){
    mbx=max;
    max=x;
   }else{
    mbx=x;
   }
  }
 }
 cout<<mbx<<endl;
 return 0;

判断整数

bool isInt(double d){
	int k=pow(10,-6);
	return d-(int)d<k && -(d-(int)d) < k;
}
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值