算法竞赛入门经典(第2版)—第一章和第二章总结

第一章
零碎知识点记录
  • 整数值用%d输出,实数用%f输出。double类型一般使用%lf来输入和输出,但在C99中输出用%f。
  • 一般输出均以回车符结束(包括最后一行),通常行末可以有多余空格,但个别题目不行。最好读清题意,确定题目的输入输出格式。
  • 输出\应该用printf("\n"),而输出%d两个字符则可以用%c输出两个变量(其值分别为%和d)。
  • int类型的取值范围-231 到 231-1(9个0)。long long类型的取值范围-263 到 263-1(18个0),并且输入输出为%lld。C语言中的int和long long
第2章
零碎知识点记录
  • floor函数:一个小数向下取整,返回double类型的数。因为double类型直接转int是直接截取整数部分,所以可以使用int a = floor(x+0.5)来实现四舍五入的效果。
  • 不要在比较两个double类型是数是否相等,因为有浮点误差,但可以比较大小。
  • 10-6可以表示为1e-6。
  • 在计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每一步运算后对n取余,结果不变。
  • scanf函数有返回值,返回的是成功输入的变量个数。即scanf("%d", &x)==1。
  • 在进行测试while(scanf("%d", &x)==1),可能会因为输入个数不确定而无法测试,但是在Windows下先按Enter键,再按Ctrl+Z键,最后按Enter键即可结束。在Linux下,输入完毕后按Ctrl+D键即可结束输入。
  • cout中输出小数点后4位:cout << fixed << setprecision(4) << value << endl;使用cout标准输出控制小数点后位数
  • next_permutation(a, a+n):按字典序获取a的全排列。在使用该函数时,一般先使用sort(a, a+n)来获得a的最小字典排序,并且该函数一般与do-while循环有关。 注意其头文件为algorithm
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        int a[1000];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        do{
            for(int i=0;i<n;i++)
                printf("%d ",a[i]);
            printf("\n");
        }while(next_permutation(a,a+n));
    }
    return 0;
}
  • 比较大的数组应该尽量声明在main函数外,否则会栈溢出,程序无法运行。
  • 从数组a复制k个元素到b数组中:memcpy(b, a, sizeof(int)*k)。将数组a全部复制到b数组中:memcpy(b, a, sizeof(a))。注意其头文件为string.h或cstring。
  • &&是短路运算,x+1<n && !a[x],当x+1>=n时,不会运算后面的式子。
  • strchr(char *s, char c):表示查找c在s字符串中第一次出现的位置(返回其指针),如果未找到则返回NULL。strrchr(char *s, char c):表示查找c在字符串s中最后一次出现的位置(返回其指针),如果未找到则返回NULL。
韩信点兵问题

参考博文:韩信点兵算法
算法:
当除数分别是3、5、7时,

  • 用70乘以用3除的余数
  • 用21乘以用5除的余数
  • 用15乘以用7除的余数
  • 然后把这三个乘积相加
    加得的结果如果比105大,就除以105,所得的余数就是满足题目要求的最小正整数解。也就是说一定会有最小正整数解,但如果最小正整数解大于所给的范围则输出无解。
printf中固定宽度和精度的输出

参考博文:C语言(C++)中:详解floor函数、ceil函数和round函数
printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个*代替那个常量,然后在后面提供变量给*,同时变量为负时表示左对齐,为正时表示右对齐。

#include <stdio.h>
int main(void) {
    char s[] = "abcdefg";
    int i = 12345;
    double d = 123.45678;

    printf("%s\n", s);//abcdefg,输出字符串
    printf("%.*s\n", 3, s);//abs,输出字符串前三个字符
    printf("%#.8x\n", s);//0x006dfef8,输出十六进制地址
    printf("%#p\n\n", s);//0x6dfef8,取地址

    printf("%d\n", i);//12345,正常输出
    printf("%*d\n", 10, i);//     12345,控制宽度为10,单右对齐
    printf("%0*d\n\n", 10, i);//0000012345,补0

    printf("%f\n", d);//123.456780,默认六位小数
    printf("%.*f\n", 3, d);//123.457,三位小数
    printf("%20.10f\n", d);//     123.4567800000,表示总宽度为20位,其中小数部分占10位。
    printf("%*.*f\n\n", 20, 10, d);//     123.4567800000,
    return 0;
}

博文链接:
C语言之字符串函数相关总结
C/C++常用输入输出函数总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值