NEFU寒假集训

·scanf的正则表达式之一
·字符串相关函数(strcpy,strcmp,reverse
·排序(sort,数组,桶排)
·条件运算符
·二进制枚举,异或

·scanf的正则表达式之一

一般我们是scanf("%s",xxxx),有时我们希望空格也输入进去,可以用scanf("%[^\n]",xxxx)
%[^\n]的意思就是以’\n’作为输入的结束标志。
同理%[^,]就是以’,‘做输入的结束标志。
其它的如%[a-z]表示匹配a到z中任意字符
%[aB’]匹配a、B、'中一员
%[^a]匹配非a的任意字符

字符串相关函数

strcpy(字符串的复制)
用法: Strcpy(a,b) //把b复制给a.
strcmp(字符串的比较)
解释:用于比较两个字符串并根据比较结果返回整数
根据ascii码来比较
eg:abc<bbc
abc<abcd
用法:strcmp(str1,str2),
若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数
reverse(字符串【数组,容器】的逆序)
用法:string strTmp = “abcd”;
reverse(strTmp.begin(),strTmp.end());

排序(sort,数组,桶排)

sort排序

• 从小到大排序可以写成

• sort(a,a+n,less<要进行排序的数据类型>())

• 从大到小排序可以写成

• sort(a,a+n,greater<要进行排序的数据类型>())
数组排序

int A[100];
bool cmp1(int a,int b)//int为数组数据类型
{
return a>b;//降序排列
//return a<b;默认的升序排列
}
sort(A,A+100,cmp1);

结构体排序
需要自定义排序(常用cmp)

bool cc(student a,student b)
{
    if(a.high!=b.high) return a.high>b.high;
    else return a.xh<b.xh;
} 
  sort(s,s+n,cc);

桶排序
• 桶排序,是一种计数排序,就是把要排序的数据放到桶里,我们需要设置桶的数量(即排序的范围),把数据放到与之匹配的桶里,改变记录桶有多少个数据的变量(一定要在装数据之前初始化),输出时要遍历所有桶,选数据不为0的数据输出,按编号输出即可。
将所输入数据作为数组的下标
eg:

#include<stdio.h>
int main()
{
    int a[11],i,j;
    for(i=0;i<11;i++)
  {
     a[i]=0;
    }
    int n;//人数
    scanf("%d",&n);
    int t;//用t接收分数
    for(i=0;i<n;i++)
    {
       scanf("%d",&t);
       a[t]++;
    }
    for(i=0;i<11;i++)
    {
        for(j=1;j<=a[i];j++)
        {
            printf("%d ",i);
        }
    }
    printf("\n");
    return 0;
}

条件运算符

 return  ( b ? ( gcd(b,a%d) ) : a ) ;  
     //这句代码应该这样划分  
 return () ;  //返回括号内值
   
  b?(): a;       // ?:语法  b为true时,整个式子值为()内的值;b为false时,整个式子值为a的值
   
  gcd(b,a%d)     // 再次调用gcd(int a,int b)函数(此次运用了递归)。

条件运算符具有右结合性,当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。

w<x ? x+w : x<y ? x : y
与 w<x ? x+w : ( x<y ? x : y) 等价
与 (w<x ? x+w : x<y) ? x : y 不等价

二进制枚举

对于某些变量的取(1)或不取(0)
以下仅为个人理解:

for(i=0;i<(1<<n);i++)  //i的作用:得到所有的可能情况
    {
        s=0;
        for(j=0;j<n;j++)  //j的作用:将i所得到的情况所对应的值取出【(1)(再加以操作)】
        {if(i&(1<<j))//异或
                s+=a[j];
        }
        if(s==p) ans++;
}
 for(j=0;j<n;j++)
      {                   
            if(i&(1<<j))
                s+=a[j];
       }
/*
eg;
i为
0 0 1 0 1
则j从1开始(即j==0时)
0 0 0 0 1     
0 0 0 1 0
0 0 1 0 0    // 1前没有数,默认为0
0 1 0 0 0
1 0 0 0 0


j循环

取出了第3和第5位

再进行操作

 
*/

异或
^

同^同==0;

不同^不同==1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值