1. 函数:(前面都是基础,后面的才好看)
目录
1. 函数:(前面都是基础,后面的才好看)
1)库函数:
2)自定义函数:自己编写的函数,不可与库函数重名,命名规则同变量、数组等
__________________________________
2. 结构体:将不同类型的变量(或数组)“捆绑到一起”
1)声明格式:
2)应用结构体
__________________________________
3. 常用技巧:
1)辗转相除法:
________________
2)快速幂:
________________
3)埃氏筛法:
__________________________________
4. 高精度算法(几个模板):
1) 高精度加法:
__________________________________
2) 高精度减法:
__________________________________
3) 高精度乘法:
__________________________________
4) 高精度除法:
__________________________________
5. 位运算:
注:负数以补码形式参与位运算
__________________________________
6. 贪心算法;
__________________________________
7. 递推算法:
1)库函数:
c++自带函数,使用时对应不同头文件:e.g strlen函数使用
#include< string >
2)自定义函数:自己编写的函数,不可与库函数重名,命名规则同变量、数组等
格式: 函数类型 (函数所需参数)
{
函数内容;
return 返回内容 ;
}//注:函数类型可以没有,即为void,此时没有“return”
__________________________________
2. 结构体:将不同类型的变量(或数组)“捆绑到一起”
1)声明格式:
1)声明格式:
struct 结构体名{
结构体内容类型 结构体内容名;
……
}变量;//注意分号;
2)应用结构体
A.函数中的应用:函数名(结构体名 变量名)
B.主函数的应用:变量.结构体内容名
e.g
struct f{
char name[100];
int age;
}r[100];
int cmp(f a,f b)
{
return a.age>=b.age;//按年龄从大到小排序
}
__________________________________3. 常用技巧:
1)辗转相除法:
#include
using namespace std;
int gcd(int a,int b)//求a与b的最大公因数
{
while(b>0)
{
int r=a%b;
a=b;
b=r;
}
return a;
}
________________
2)快速幂:
#includeusing namespace std; int gcd(int a,int b)//求a与b的最大公因数 { while(b>0) { int r=a%b; a=b; b=r; } return a; }
________________
2)快速幂:
核心:让底数最大;算一次模一次,防止溢出
#include< bits/stdc++.h >
using namespace std;
long long f(long long a,long long n,long long mod)
//求a的b次方对于mod取模的结果
{
long long ans=1;
a= a % mod;
while(n)
{
if(n%2)
{
ans*=a;
ans%=mod;
}
a=a*a;
a=a%mod;
n=n/2;
}
return ans%mod;
}
________________
3)埃氏筛法:
核心:避免重复筛查
#include__________________________________using namespace std; int main() { int m,n,ans=0; //求m与n之间质数(素数)的个数 scanf("%d %d",&m,&n); int pd[n]; for(int i=0;i =m){ printf("%d ",i); ans++; } for(int l=2*i;l<=n;l=l+i) { pd[l]=1; } } } printf("n%d",ans); return 0; }
4. 高精度算法(几个模板):
1) 高精度加法:
#include
using namespace std;
int main()
{
char a[5050],b[5050],aa[5050],bb[5050],ans[5050];//定义
for(int i=0;i<5050;i++)//初始化
{
a[i]=0;
b[i]=0;
aa[i]=0;
bb[i]=0;
ans[i]=0;
}
scanf("%s %s",a,b);//输入
for(int i=strlen(a)-1,l=0;i>=0;i--,l++)
{
aa[l]=a[i]-'0';//转换成数组并逆序存入
}
for(int i=strlen(b)-1,l=0;i>=0;i--,l++)
{
bb[l]=b[i]-'0';//转换成数组并逆序存入
}
int p=max(strlen(a),strlen(b)),x=0;//计算答案大小
for(int i=0;i=10)//计算进位
{
x=1;
ans[i]=ans[i]-10;
}
}
for(int i=p;i>=0;i--)//删除补位零
{
if(i==p&&ans[i]==0)
{
i--;
}
printf("%d",ans[i]);//输出答案
}
return 0;
}
__________________________________
2) 高精度减法:
#include
using namespace std;
int main()
{
char a[5050],b[5050],aa[5050],bb[5050],ans[5050];
for(int i=0;i<5050;i++)//初始化
{
a[i]=0;
b[i]=0;
aa[i]=0;
bb[i]=0;
ans[i]=0;
}
scanf("%s %s",a,b);//输入数据
for(int i=strlen(a)-1,l=0;i>=0;i--,l++)
{
aa[l]=a[i]-'0';//转换并逆序
}
for(int i=strlen(b)-1,l=0;i>=0;i--,l++)
{
bb[l]=b[i]-'0';//转换并逆序
}
int p=max(strlen(a),strlen(b)),x=0;
for(int i=0;i=0;i--)//删除补位零并输出答案
{
if(i==p&&ans[p]==0)m=1;
if(m==1&&ans[i]!=0)m=0;
if(m==0)
{
printf("%d",ans[i]);
n=1;
}
}
if(n==0)printf("0")
return 0;
}
__________________________________
3) 高精度乘法:
#include
using namespace std;
int main()
{
char al[5005],bl[5005];
int a[5005],b[5005],c[10005];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s%s",al,bl);
int lena=strlen(al);
int lenb=strlen(bl);
for(int i=0;i1)
{
lenc--;
}
for(int i=lenc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}
__________________________________
4) 高精度除法:
#include__________________________________using namespace std; int main() { char a[5050],b[5050],aa[5050],bb[5050],ans[5050];//定义 for(int i=0;i<5050;i++)//初始化 { a[i]=0; b[i]=0; aa[i]=0; bb[i]=0; ans[i]=0; } scanf("%s %s",a,b);//输入 for(int i=strlen(a)-1,l=0;i>=0;i--,l++) { aa[l]=a[i]-'0';//转换成数组并逆序存入 } for(int i=strlen(b)-1,l=0;i>=0;i--,l++) { bb[l]=b[i]-'0';//转换成数组并逆序存入 } int p=max(strlen(a),strlen(b)),x=0;//计算答案大小 for(int i=0;i =10)//计算进位 { x=1; ans[i]=ans[i]-10; } } for(int i=p;i>=0;i--)//删除补位零 { if(i==p&&ans[i]==0) { i--; } printf("%d",ans[i]);//输出答案 } return 0; }
2) 高精度减法:
#include
using namespace std;
int main()
{
char a[5050],b[5050],aa[5050],bb[5050],ans[5050];
for(int i=0;i<5050;i++)//初始化
{
a[i]=0;
b[i]=0;
aa[i]=0;
bb[i]=0;
ans[i]=0;
}
scanf("%s %s",a,b);//输入数据
for(int i=strlen(a)-1,l=0;i>=0;i--,l++)
{
aa[l]=a[i]-'0';//转换并逆序
}
for(int i=strlen(b)-1,l=0;i>=0;i--,l++)
{
bb[l]=b[i]-'0';//转换并逆序
}
int p=max(strlen(a),strlen(b)),x=0;
for(int i=0;i=0;i--)//删除补位零并输出答案
{
if(i==p&&ans[p]==0)m=1;
if(m==1&&ans[i]!=0)m=0;
if(m==0)
{
printf("%d",ans[i]);
n=1;
}
}
if(n==0)printf("0")
return 0;
}
__________________________________
3) 高精度乘法:
#include
using namespace std;
int main()
{
char al[5005],bl[5005];
int a[5005],b[5005],c[10005];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s%s",al,bl);
int lena=strlen(al);
int lenb=strlen(bl);
for(int i=0;i1)
{
lenc--;
}
for(int i=lenc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}
__________________________________
4) 高精度除法:
=0;i--)//删除补位零并输出答案 { if(i==p&&ans[p]==0)m=1; if(m==1&&ans[i]!=0)m=0; if(m==0) { printf("%d",ans[i]); n=1; } } if(n==0)printf("0") return 0; }
#include__________________________________using namespace std; int main() { char al[5005],bl[5005]; int a[5005],b[5005],c[10005]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%s%s",al,bl); int lena=strlen(al); int lenb=strlen(bl); for(int i=0;i 1) { lenc--; } for(int i=lenc;i>=1;i--) { printf("%d",c[i]); } return 0; }
4) 高精度除法:
A. 高精除低精:
#includeusing namespace std; int main() { char al[6000]; int a[6000],b,c[6000]; memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); scanf("%s%d",al,&b); int lena=strlen(al); for(int i=0;i __________________________________
B. 高精除高精.***
#include__________________________________using namespace std; int a[5005],b[5005],c[5005];//定义 void init(int a[]) { char s[5005]; scanf("%s",s); a[0]=strlen(s); for(int i=0;i0;i--) { printf("%d",a[i]); } printf("n"); } int cmp(int a[],int b[])//判断大小 { if(a[0]>b[0])return 1; if(a[0]0;i--) { if(a[i]>b[i])return 1; if(a[i]0&&a[a[0]]==0) { a[0]--; } return; } } void numcpy(int p[],int q[],int det) { for(int i=1;i<=p[0];i++) { q[i+det-1]=p[i]; } q[0]=p[0]+det-1; } void chugao(int a[],int b[],int c[]) { int tmp[5005]; c[0]=a[0]-b[0]+1; for(int i=c[0];i>0;i--) { memset(tmp,0,sizeof(tmp)); numcpy(b,tmp,i); while(cmp(a,tmp)>=0) { c[i]++; jian(a,tmp); } } while(c[0]>0&&c[c[0]]==0)//删除补位零 { c[0]--; } } int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); init(a); init(b); chugao(a,b,c); print(c); return 0; } 5. 位运算:
1.作用:提高运算速度
2.符号:
'&' 与 两个位都为1时,结果才为1
'|' 或 两个位都为0时,结果才为0
'^' 异或 两个位相同为0,相异为1
'~' 取反 0变1,1变0
'<<' 左移 各二进位全部左移若干位,高位丢弃,低位补0
'>>' 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
注:负数以补码形式参与位运算 __________________________________
6. 贪心算法;
核心:每一步都最优化
__________________________________7. 递推算法:
核心:找到递推方程



