今天,我给大家介绍一些 c++常见头文件和模板,希望能给大家一些帮助!
--------------------------------------------------------------------------------
一、常见模板:
(1)判断质数。
判断质数就是从2开始枚举到根号n,如果有一个数能被n整除,说明它是一合数,相反如果成功则说明它是一质数。
#include<iostream>
#include<cmath>
using namespace std;
int pan(int n){
for(inti=2;i<sqrt(n);i++){
if(n%i==0)
return false;
}
return true;
}
int main(){
int n;
cin>>n;
if(pan(n))
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
return 0;
}
有以下例题:
素数对
- 总时间限制: 内存限制:
- 1000ms 65536kb
- 描述
-
两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。
- 输入
- 一个正整数n。1 <= n <= 10000。
- 输出
- 所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。
- 样例输入
-
100
- 样例输出
-
3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73
代码如下:
#include<bits/stdc++.h>
int kk(int a)//把判断闰年写成函数,使程序简便
{
int i;
for(i=2;i<=a-1;i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main ()
{
int n,i,k;
scanf("%d",&n);
for(i=5;i<=n;i++)
{
k=i-2;
if(kk(k)==1&&kk(i)==1)
printf("%d %d\n",k,i);
}
if(n<=4)
printf("empty");
return 0;
}
--------------------------------------------------------------------------------
(2)求两数的最大公因数和最小公倍数
一般的做法是分别枚举两数的公因数,从中找出最大的,就是它们的最大公因数,但这样比较耗时,所以我给大家推荐欧几里德的辗转相除法:
辗转相除法
#include<cstdio>
int main()
{
long long a,b,c;
scanf("%lld%lld",&a,&b);
while(c!=0)
{
c=a%b;
if(c==0)//c等于0意味着此时除数b为最初a,b的最大公因数
break;
a=b;//每一次把所除后的除数的值给被除数,余数的值给除数,以达到循环求最大公因数的目的
b=c;
}
printf("%lld",b);
return 0;
}
这一算法是一十分神奇的算法,我们不得不被古希腊人的智慧所震撼(mēng bī)!!
有以下例题:
最接近的分数
-
总时间限制:
内存限制:
-
1000ms
65536kb
- 描述
-
分母不超过 N 且 小于 A/B 的最大最简分数是多少?
- 输入
- 三个正整数N,A,B,相邻两个数之间用单个空格隔开。1 <= A < B < N <= 1000。
- 输出
- 两个正整数,分别是所求分数的分子和分母,中间用单个空格隔开。
- 样例输入
-
100 7 13
- 样例输出
-
50 93
分析:做这道题我们用双重循环来进行枚举,外层循环枚举分母B,内层循环枚举分子A,再用两个变量来存储运算中的算出来的临时的“分母不超过 N 且 小于 A/B 的最大最简分数”,而判断分子分母是否“最简”,则判断它们的最大公因数是否为1,而求两数最大公因数则用辗转相除法~~,代码如下:
#include<cstdio>
int main()
{
double n,a,b,i,j,x,y,c=1,h=0,k=1,z;//定义为double主要是为了判断值是否小于z
int o,p;
scanf("%lf%lf%lf",&n,&a,&b);
z=a/b;
for(j=1;j<=n;j++)//i为分母
{
for(i=1;i<j;i++)//j为分子
{
y=i/j;
if(y<z)
{
o=i;
p=j;
while(c!=0)//进行辗转相除法
{
x=o%p;
if(x==0)
break;
o=p;
p=x;
}
if(p==1)//判断分子分母是否互质
{
if(h/k<i/j){
h=i;
k=j;}
}
}
}
}
printf("%d %d",int(h),int(k));
return 0;
}
再来一道题,这道题更是完美诠释了辗转相除法: