1.注意变量的初始化!!!
2.n进制转10进制求和
数组转:
for(int i=0;i<len;++i){
sum=sum*进制+a[i];
}
3.较大内存数组应在main函数外定义(即定义成全局数组),如a[100000],a[1000][1000];
4.定义全局变量可方便在main函数及其他函数中改变变量的值(矩阵,matrix),但是慎用;
5.用scanf(“”,%s),gets(),getchar()时,前面加上一个getchar()吸收回车;
6.循环(特别for循环)中注意循环变量的改变! i和j不要写错位置,若有多重循环,每层循环的循环变量不要重复,弄错,注意跟踪其中变量改变,仔细检查其中参数;
9.若无限输入完整一行字符串(即含回车或其他特殊字符)
getchar();
while(gets(a)!=NULL)
若输入0结束:
gerchar();
while(gets(a)!=0)
正常输入字符串:scanf(“%s”,a);
10.递推求组合数
define M 100000007
__int64u C[1000][1000]//全局变量
void combination(void)
{
int i,j;
for(i=0; i<=1000; ++i)
{
C[0][i] = 0;
C[i][0] = 1;
}
for(i=1; i<=1000; ++i)
{
for(j=1; j<=1000; ++j)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % M;
}
return;
}
12.全错排公式:d[n]=(n-1)*(d[n-1]+d[n-2])
错排公式:d(n,m)=d(m,m)+c(n,m);
13.求数组长度:
int len(int a[]){
int n = 0;
while(a[n] != '\0')
{
n++;
} //'\0'表示的是数组存放元素结束的标志
return n;
}
或者:int len = sizeof(a) / sizeof(int);
14.快速排序(qsort):
头文件:#include<stdlib.h>
int a[10000];
int compInc(const void *a, const void *b)
{
return *(int *)a - *(int *)b;//从小到大排
}
int compDec(const void *a, const void *b)
{
return *(int *)b - *(int *)a;//从大到小排
}
void quicksort(int a[])
{
qsort(a,l,sizeof(a[0]),compInc);
}
(该快排对于64位的排序无效,有另外的快排模板)
15.初始化任意数组:memset,速度最快
头文件:#include<string.h>
memset(a,l,sizeof(a));
16.求素数(在不能用筛法或者不必用筛法的情况下)
typedef __int64 ll;
int isprime(int a)//素数判定
{
int i,k;
if(a==2)
{
return 1;
}
else if(a<2 || a%2==0)
{
return 0;
}
k=sqrt((double)a);
for(i=3;i<=k&&a%i;i+=2);
if(i>k)
return 1;
else
return 0;
}
或
int prime(ll a)
{
if(a==1){
return 0;
}
if(a==2||a==3){
return 1;
}
if(a%6!=1&&a%6!=5){
return 0;
}
int x=sqrt((double)a);
for(int i=5;i<=x;i+=6){
if(!(a%i)||!(a%(i+2))){
return 0;
}
}
return 1;
}
17.埃氏筛法
#include<math.h>
#define N 1000000
int a[N]={1,1};
void prime(void)
{
for(int i=0;i<=sqrt(N);i++)
{
if(!a[i]){
for(int j=i*i;j<=N;j+=i)
a[j]=1;
}
}
}
18.bool函数
在c语言中使用bool函数应当引入头文件<stdbool.h>,c++中则不需要
19.用引用写swap函数
void swap(int & a, int & b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
swap(test1, test2);
return 0;
}
20.欧拉函数
1.求单个数的欧拉函数
typedef long long int ll;
ll Euler(ll n)
{
ll res=n;
int m = sqrt(n);
for (int i = 2; i <=m; ++i) {
if (!(n % i)) {
res = res / i * (i - 1);
while (!(n % i)) {
n /= i;
}
}
}
res = res / n * (n - 1);
return res;
}
2.筛法
typedef long long int ll;
void Euler(ll n)
{
int m = sqrt(n);
for (ll i = 1; i <= n; ++i) {
prime[i] = i;
}
for (ll i = 2; i <= m; ++i) {
for (ll j = i * i; j <= n; j += i) {
prime[j] = i;
}
}
for (ll i = 2; i <= n; ++i) {
if (!(i % prime[i])&&!(i/prime[i]%prime[i])) {
phi[i] = phi[i / prime[i]] * prime[i];
}
else if (!(i % prime[i]) && (i / prime[i] % prime[i])) {
phi[i] = phi[i / prime[i]] * (prime[i] - 1);
}
}
return;
}