c语言笔记

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;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值