数学库函数
头文件
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;
}
求最大公因数
- 辗转相除法(欧几里得算法)
//求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;
}