zoukankan      html  css  js  c++  java
  • 【雑】カオス

    不要问我为什么名字叫这个qaq

     一.一就是用来乱扯的...?

    打个小小的

    广告

    啦啦啦~

    不仅有精心提炼的图论

      还有你不得不学的数论 。

    #include <bits/stdc++.h>
    //万能头文件
    
    #define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
    #define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
    #define frei(s) freopen(s,"r",stdin)
    #define freo(s) freopen(s,"w",stdout)
    #define ll long long
    #define u unsigned
    #define ssr(q) scanf("%d",&q);
    #define sr(q) printf("%d",q);
    #define Q int
    //...可以随便搞 
    
    using namespace std;
    
    #define rt return
    #define inf 0x3f3f3f3f
    #define infll 4557430888798830399ll
    #define pc(x) putchar(x)
    #define spc putchar(' ')
    #define gc getchar()
    #define ln pc('
    ')
    #define writeint(x) printf("%d",x)
    #define lowbit(x) (x&(-x))
    //如果用的多的话可以 省时省力! 
    
    int main()
    {
        Q w;
        ssr(w);
        sr(w);
        //以下不一一列举
        //...     
        rt 0;
    } 

    +

    for(int t=m; t; t--) a[++n] = b[t];
    // 循环中间的 t:非零即真,遇到 t=0 才停下
    int ans(0); // 效果等价于 ans=0

    +

    编表的num从0开始++,跟从1开始++的区别
    如果从0开始编号,在往上反的过程中会用到0(因为0的编号是0(为假)嘛),所以要将head数组手动设置为-1才能进入0号元素那条边,如果不设置为-1,只能用1往后的边
    所以
    (Ps:now初始值为0)
    void add(int pre,int to)
    {
        h[now].to=to;
        h[now].next=heads[pre];
        heads[pre]=now++;
    /*
    前提是heads数组已经设置为-1,并且在使用的时候
    for(int j=heads[i];j!=-1;j=h[j].next)
    或者
    //for(int j=heads[i];~j;j=h[j].next)
    ~表示取反.
    */ } 而如果这样的话 void add(int pre,int to) { h[++now].to=to; h[now].next=heads[pre]; heads[pre]=now; /* 从一开始编号的话,到0就停止,所以不需要手动设置为-1 */ } (额...学姐说的%%%)

    +

    ///优读
    inline int reads() { int x=0,f=1; char ch=getchar(); while(ch>'9' || ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; }

     二.0号元素很想你qwq

      开数组的时候我们都喜欢从1号开始使用,而把0号元素冷落了

    但是开了就是开了,0号闲着也是闲着,不如把它合理的利用起来!

    所以,可以用a[0]来计数,

    a[0]++,a[0]--什么的,

    回收利用我最强!2333

     三.字符串读入方式

    读字符(串)的各种方式,老是出错的你中枪了吗???

    列出几种空白符:换页符、纵向制表符、横向制表符(' ')、空格(' ')、换行符(' ')、回车符(' ')

    char ch;
    char str[11];

    1.getline读入:

        读入整行数据,它使用回车键输入的换行符来确定输入结尾.
        调用方法: 

          首先说明getline()的原型:getline (istream &is,string &str,char delim)

          istream &is表示一个输入流,譬如cin.

          string表示把从输入流读入的字符串存放在这个字符串中(&str其实就是一个变量)

          char delim是终止符(默认为回车,还可以是别的符号,如#,*之类的都可以)

          而对于while(getline(cin,str))来讲,while语句的真实判断对象是cin,也就是当前是否存在有效的输入流,如果存在就不会结束循环

     getline(cin,str, '
    ');

    2.scanf读入:

        scanf函数不检测读入的字符的个数,仅仅是不断的从标准输入流(键盘)中读入字符,直到遇到“空白符”.scanf从输入流中取出“空白符”.

        1)读入单个字符时读入换行符空格什么的

          使用scanf("%c", &ch); 读取ch (ch是char类型),如果读取之前有换行符或者空格,那么ch就会把之前的换行符或者空格读取到,解决方法就是这之前先getchar()一下

        2)读取字符串时(不管字符串是char或者char[]都是可以的),并不会不会读取前边的换行符或者空格

             使用scanf("%s",str); 读取str (str是字符串类型),

           如果读取之前有换行符或者空格,str也不会把之前的换行符或者空格读取到,所以使用它读入字符串的时候可以大胆放心啦~

        3)读取二维char数组不能用scanf("%s", str[i][j]),但是是可以使用scanf("%s", str[i])或者scanf("%c",&str[i][j])的,相比较而言前者速度更快一些.

         至于原因嘛:可能是数组名可以表示数组首地址的原因?

    Eg:

        scanf("%s",str[i]+1); 
      scanf("%c",&ch);
    /* 像第一行那样读入的时候就能够强制的让字符串从1号数组开始, 因为默认字符串的读入都是从0号元素开始的, 并且有一点需要说明的是: scanf读入字符串时不能够加"&"号!
    (但是在读入单个字符时是必须要加上"&"符号的!)
    */

    3.cin读入:

        不读换行符

        (是用空白(空格,制表符和换行符)来定字符串的界的)

    Eg:

        cin>>s; //不读入换行符什么的,我感觉最好用啾啾啾~,但是……空格也是读不进去的,这就有点……

    4.fgets读入:

        读入的是带' '的字符串,一直进行读取直到遇到' ',并将' '从输入流中取出.

        (会读入' '   //空白符)

        前提是(不超过第二个参数的情况下,它从第三个参数(文件指针,输入流)中不断的读入字符).

    5.gets读入:

        读取空字符,并且还读取换行符(这真的略尴尬……).

        (还读入' '   //空白符)

        它的读入是不检测读入的字符的个数的.仅仅是不断的从标准输入流(键盘)中读入字符,直到遇到' '.

        与fgets不同的是,虽然gets函数也会将' '从输入流中取出,但却只是取出,然后将其丢掉.他是并不保存在目标字符串中的.

    PS:

    其中fgets函数是安全的,gets和scanf函数都是不安全的

    当输入的字符大于等于11时,会数组越界.编译并不会保存,甚至运行时也不会保存.

    但极可能因为对str数组越界写入,导致更改了其他变量的值!

    6.字符读入getchar+字符输出putchar函数:

        getchar函数是接收从键盘输入的单个字符数据,它是一个无参函数

        用法:

    ch=getchar();//通常把输入的字符赋予一个字符变量,构成赋值语句
    /*
    1)只能接收单个字符,输入数字也按照字符来处理
    2)输入多于一个时,只接收第一个
    3)回车键结束
    4)如果有连续两个以上,应该一次性输入所需字符,最后再按回车,否则,将进行接收回车,将其作为一个字符串给后面的getchar()函数
    */

        putchar函数是字符输出函数,输出单个字符

        用法:

    putchar(ch); //ch为字符变量或常量 

    如果实在看不懂的话可以出门拐角去百度一下,或者直接给你个链接? 

    http://blog.csdn.net/cyuyanenen/article/details/51602922

     四.字典序

      数字的字典序是说1 < 2 , 13 < 9;

      而字母的字典序是说 zzz > zzx ,即26 26 26 > 26 26 25

      依然是将他转化为数字然后进行比较

     五.字符串中lenth与find函数的用法

    #include<cstdio>
    #include<iostream>
    
    using namespace std;
    
    string a;
    
    int main() {
        cin>>a;
        int x=a.length();
        printf("%d
    ",x);//会输出字符串的长度,不是从0开始记数
        int y=a.find('q');
        printf("%d
    ",y);
    //会输出字符串寻找‘q’这个字符的时候所遇到的第一个‘q’的地址,如果没有,返回-1
        return 0;
    }

     六.指针!

      看了一些资料,指向二维数组的指针定义方式并不是直接定义指针的指针

    int   a[3][6];
    int **p=a;//像这样定义是错误的

      因为a代表着除了第一列以外的列数的维数大小,如a+1的地址就是a[1]的地址,也就是a[1][0]的地址,而p仅是整形指针的指针,没跨越一次就是4字节,因此他们的大小是不匹配的,所以这样子直接等于号是不正确的。

      要真正的定义方式应概是定义指向n维数组的指针,n就是除第一维的另外维度,

      如上面的指针定义应该为

    int  (*p)[6];
    p=a;

      这样子就 可以就可以通过p以下标形式来访问数组。

      接下来给出一些比较简单的代码:

    #include<cstdio>
    #include<iostream>
    
    using namespace std;
    
    /*
    指针的
    相加或者相乘 
    */
    
    int main()
    {
        int a,b,s,t;
        cin>>a>>b;
        int *p;
        p=&a;
        int *q;
        q=&b;
        s=(*p)+(*q);
        t=(*p)*(*q);
        printf("a=%d
    ",*p);
        printf("b=%d
    ",*q);
        printf("a+b=%d
    ",s);
        printf("a*b=%d
    ",t);
        return 0;
    }

     七.map

    http://www.cnblogs.com/zxqxwnngztxx/p/6701478.html

     八.位运算

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    int main()
    {
        int q;
        cin>>q;
        int w=q<<1;//等价于q*2
        int e=1<<q;//等价于2的q次方
        int r=q>>1;//等价于q/2
        int t=1>>q;//等价于0
        cout<<w<<" "<<e<<" "<<r<<" "<<t;
        return 0;
     }

     九.不给几组数据的各种输入方式

      倘若若干组数据分别有m个输入

      下面所提到的(*m)均指执行多少次

      1)EOF

           while(scanf("%……*m",&……*m)!=EOF);

      2)while(scanf("%……*m",&……*m)==m);

      3)while(cin>>……*m);

     十.break,continue,return的区别

      1)break

         直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。他只能跳出一层循环

    注意:如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出. 

      2)continue

         也是终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行.     

      3)return

       语句可被用来使 正在执行分支程序返回到调用它方法。

    详细的return在这里(http://www.cnblogs.com/zxqxwnngztxx/p/6758491.html)啦~

     

     

    (未完待续?)

  • 相关阅读:
    大数据学习笔记01
    寻址方式
    指令格式
    虚拟存储器
    高速缓冲存储器Cache
    双端口RAM和多模块存储器
    主存储器与CPU的连接
    半导体存储器
    存储系统——基本概念
    算术逻辑单元
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6818061.html
Copyright © 2011-2022 走看看