编程技巧和常用函数

一、long long用法
1. 关于long long类型在windows下和Linux下输入、输出的区别。例如:
long long a;
Windows环境:scanf(“%I64d”,&a);  printf(“%I64d”,a);
Linux  环境:scanf(“%lld”,&a);  printf(“%lld”,a);

double x;
scanf(“%lf”,&x);  printf(“%f”,a);  注意:输出是f,不能使lf。

2. 关于 cout 和 printf 输出实数,小数点后保留位数问题
   例子:输出 ans ,小数点后保留三位。

二、数组赋初值

memset(a,0,sizeof(a));      //全部赋为0
memset(a,127,sizeof(a));    //全部赋为 2139062143
memset(a,128,sizeof(a));    //全部赋为 -2139062144

三、数组拷贝
memcpy(b,a,sizeof(a));      //把a数组的值拷贝到b数组

四、字符串和整数的转换
char S[100]; 
char ch1[11],ch2[11];
int N;
1、将字符数组S转化成整数N :sscanf(S,”%d”,&N)
2、将整数N转化成字符数组S :sprintf(S,”%d”,N)
3、将字符数组S中空格隔开的两个单词分别存在ch1和ch2中 :sscanf(S, "%s%s",ch1,ch2);

4. int 转 string

5. string 转 int

五、string 类型的操作(P135)   注意:string类型只能用cin输入、cout输出

s.empty() 如果s为空串,则返回true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s中位置为n的字符,位置从0开始计数(可将值赋给s[n])
s1+s2 把s1和s2连接成一个新字符串,返回新生成的字符串
s1=s2 把s1内容替换为s2的副本
v1==v2 比较v1与v2 的内容,相等则返回true ,否则返回false
!=,<,<=,>和>= 保持这些操作符惯有的含义

其它string类函数:

s.insert(pos,s2) 在s下标为pos的元素前插入string类型s2
s.substr(pos,len) 返回一个string类型,它包含s中下标为pos起的len个字符
s.erase(pos,len) 删除s中下标为pos开始的len个字符
s.replace(pos,len,s2) 删除s中下标为pos的len个字符,并在下标为pos处插入s2
s.find(s2,pos) 在s中以pos位置起查找s2第一次出现的位置
s.c_str() 返回一个与s字面值相同的C风格的字符串数组临时指针

六、字符数组函数(P87)   定义字符数组:char s[100]; char ch ; int n;

strlen(s) 获得字符串s的长度
strcmp(s1,s2) 字符串比较,返回整数 x
如果s1>s2,则x>0; 如果s1=s2,则x=0; 如果s1 
strcat(s1,s2) 字符串连接,返回s1=s1+s2
strcpy(s1,s2) 复制字符串,返回s1=s2
strstr(s1,s2) 字符串匹配,返回在s1中第一次出现s2的位置
atof(s) 字符串s转成实数
atoi(s) 字符串s转成整数。
另外也可以用:也可以用 sscanf(s,”%d”,&n)
isalpha(ch) 判断ch是否是字母。是字母则返回true,否则返回false
另外也可以用:if ((ch>=’a’&& ch<=’z’) || (ch>=’A’&& ch<=’Z’))
islower(ch); 判断ch是否是小写字母,是小写字母则返回true,否则返回false
另外也可以用:if (ch>=’a’&& ch<=’z’)
isupper(ch) 判断ch是否是大写字母,是大写字母则返回true,否则返回false
另外也可以用:if (ch>=’A’&& ch<=’Z’)
isdigit(ch) 判断ch是否是十进制数字字符,是数字字符,则返回true,否则返回false
另外也可以用:if (ch>=’0’&& ch<=’9’)
tolower(ch) 把ch转换为小写字母,如果ch本身就是小写,则不变。
大写字母转小写字母,也可以用:ch+(‘a’-‘A’)
toupper(ch) 把ch转换为大写字母,如果ch本身就是大写,则不变。
小写字母转大写字母,也可以用:ch-(‘a’-‘A’)

七、数学函数(P21)

函数和过程名 功能
abs(x) 求整数x的绝对值,结果是整数
fabs(x) 求实数x的绝对值,结果是实数
sqrt(x) 求实数x的算数平方根,结果是实数
pow(x,y) NOI_Linux下不能用 求实数x的y次方(xy), 结果是实数
floor(x) 求不大于实数x的最大整数,结果是实数。
rand() 产生 [0,RAND-MAX)之间的随机整数。
举例:产生 5 个[0,10)范围的随机整数:

字符ASCII编码

九、关于字符串:

1、读多行数据,到空行结束
char s[20],ch1[20],ch2[20];
string st1,st2;
while(gets(s))    //读取一行,包含空格
{                  
    if(!strlen(s)) break;       //如果读到空行就结束
    sscanf(s,"%s%s",ch1,ch2 );  //把一行中用空格隔开的两个单词从s中提取出来,分别放在ch1和ch2中;
     ..........
}

2、char数组不容易实现sort排序,string类型可以用sort排序,方法同整数排序一样。
   所以需要先把char数组转成string类型
   st1=ch1;         //char 数组转成string类型,可以排序
   st2=ch2;         //char 数组转成string类型,可以排序

3、string类型的输出(string不能直接用scanf输入和printf输出)
   方法1:cout<<st1<<"  "<<st2;
   方法2:printf("%s %s\n",st1.c_str(),st2.c_str(); //把string转成char数组用printf输出

4. string类型的正行读入方法:
   getline(cin,str1);

十、没有声明数据个数和行数,关于读到输入文件的行、尾的判断方法

1、每行是字符串的多行读入方法
【输入数据】lx.in
The algorithm is suitable for hardware implementation.
Niblack algorithm uses fix value of this weight.
Debugging realization fast sort algorithm

【输出数据】lx.out
The algorithm is suitable for hardware implementation.
Niblack algorithm uses fix value of this weight.
Debugging realization fast sort algorithm
=====================================================================
代码:
int i;  char sh[100];
int main()
{
    freopen("lx.in","r",stdin);  freopen("lx.out","w",stdout);
    while(gets(sh))   //如果本行有数据,则读入一行放在sh数组中,数组尾上是标志“\0”
    {
        for (i=0;sh[i]!='\0';i++)    //输出读入的每个字符
            printf("%c",sh[i]);                      
        printf("\n");                //跳行
    } 
  return 0;
}
=====================================================================

输出的第二种写法:
while(gets(sh))   //如果本行有数据,则读入一行放在sh数组中,数组尾上是标志“\0”
{
    puts(sh);      //整行输出(即整个字符数组全部输出)

=====================================================================
gets(sh)是整行读入字符串(包括换行符),如果本行的前一行是一个数值,用scanf("%d\n",x)读数值。
scanf("%s",sh)是读入连续的字符串,遇到空格则停止。

2、每行是多个整数的多行读入方法(没有告诉每行有几个、也没有告诉共有几行)
【输入数据】lx2.in
90 80 76
10 20 30 40 50
70 80 80 90 56 74
12 25

【输出数据】lx2.out
883 16

注释:
883表示表示所有数值的和;
16表示输入文件总共有16个数值。
=====================================================================
代码:
int i,a,n,s;
int main()
{
    freopen("lx2.in","r",stdin);
    freopen("lx2.out","w",stdout);
    s=0; n=0;
    while (scanf("%d",&a)!=EOF)     //如果没到文件尾,则循环读。(到文件尾,scanf将返回EOF)
    {
        s=s+a;      //累加每次读入的值到S中
        n=n+1;      //累加读入数的个数
    }   
    printf("%d %d",s,n);  //输出累加和s和数值个数n
    return 0;

}
=====================================================================
3、另外一种情况:while(scanf("%d%d",&a,&b)==2)
int main()
{
    freopen("lx0.in","r",stdin);
    freopen("lx0.out","w",stdout);
    int a,b; 
    while(scanf("%d%d",&a,&b)==2)  printf("%d\n",a+b);                     
    return 0;
}
=====================================================================
4、多组数据:输入文件第一行包含数据的组数t,以后每组数据……
int main()
{
    while(t--)
    {
        input();   //读取单组数据
        solve();   //求解问题
        output();  //输出
    }
}
=====================================================================
5、多组数据:每组数据第一行包含一个整数n,……,所有数据输入结束的标志为n=0。
int main()
{
    scanf("%d",&t);           //读入数据组数
    while(scanf("%d",&n)==1))
    {
        if (n==0) break;
        ……                   //读取其他数据 
    }
    return 0;
}