• [啃书] 第4篇


    前言

    第三章——入门模拟

    模拟:“题目怎么说,你就怎么做”

    本章内容较少较基础,不仅是熟悉C的写法,更主要是熟悉比赛的代码规范。

    本篇总结自《算法笔记》第3章

    正文

    敲了些综合性强的

    3.2查找x

    #include<cstdio>
    const int maxn = 210;//题目要求200多给点 
    int a[maxn];//存放n个数 
    int main(){
        int n,x;
        while(scanf("%d", &n) != EOF){//读入个数并检测是否结束 
            for(int i = 0; i < n; i++){//读入n个数 
                scanf("%d", &a[i]);
            }
            scanf("%d", &x);//读入要查找的数 
            int k;//下标 
            for(k = 0; k < n; k++){//查找
                if(a[k] == x){
                    printf("%d
    ", k);//找到输出并换行 
                    break;//跳出循环 
                }
            }
            if(k==n){
                printf("-1
    ");//没找到输出-1并换行 
            }
        }
        return 0;//返回0 
    } 

    3.3图形输出(规律输出/手动填充)

    /*画正方形*/
    #include<cstdio>
    int main(){
        int row, col;//行,列 
        char c;
        /*输入列数和要使用的字符 */ 
        scanf("%d %c", &col, &c);
        /*计算行数*/
        if(col % 2 == 1) row = col / 2 + 1; //若列数为奇数,则向上取整
        else row = col / 2; //列数为偶数直接除即可 
        /*第一行*/
        for(int i = 0; i < col; i++){
            printf("%c", c);
        }
        printf("
    "); 
        /*第2到row-1行*/
        for(int i = 2; i < row; i++){
            printf("%c", c);
            for(int j = 0; j < col - 2; j++){
                printf(" ");
            }
            printf("%c
    ", c);
        }
        /*第row行*/ 
        for(int i = 0; i < col; i++){
            printf("%c", c);
        }
        return 0; 
    }

     3.4日期处理(闰年/大小月等问题)

    #include<cstdio>
    int month[13][2] = {
        {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
                {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
    };
    bool isLeap(int year){    //判断是否闰年 
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 
    }
    int main(){
        int time1, y1, m1, d1;
        int time2, y2, m2, d2;
        while(scanf("%d %d", &time1, &time2) != EOF){
            if(time1 > time2){ //保证time1存的是小的那个
                int temp = time1;
                time1 = time2;
                time2 = temp;
            }
            y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
            y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
            int ans = 1; //记录结果(天数) 
            //第一个日期没有达到第二个日期时的时候进行循环(日子一天天过去)
            while(y1 < y2 || m1 < m2 || d1 < d2){
                d1++;//日++ 
                if(d1 == month[m1][isLeap(y1)] + 1){ //本月满
                    m1++;//月++ 
                    d1 = 1;
                }
                if(m1 == 13){
                    y1++;//年++ 
                    m1 = 1;
                }
                ans++; //不管怎样天数都++ 
            }
            printf("%d
    ", ans); //输出结果 
        } 
        return 0;
    } 

    3.5 进制转换

    #include<cstdio>
    int changeToDec(int x, int P){ //P进制数x转换为十进制数y 
        int y = 0, product = 1;
        while(x != 0){
            y = y + (x % 10) * product; //累加 个位 * product
            x = x / 10; //去掉个位
            product = product * P;
        }
        return y;
    }
    
    int* changeFromDec(int y, int Q){ //十进制数y转换为Q进制数(除基取余法) 
        int z[40], num = 0; 
        do {
            z[num++] = y % Q;
            y = y / Q;
        } while(y != 0);//商为0则停止循环
        for(int i=num; i > 0; i--)
           printf("%d",z[i-1]);
    }
    
    int main(){
        //printf("%d
    ",changeToDec(1111, 2));
        //changeFromDec(19, 2);
        
        /*输出a+b的d进制数*/
        int a,b,d;
        scanf("%d%d%d", &a, &b, &d);
        changeFromDec(a+b, d);
        
        return 0;
    }

    3.6字符串处理

    /*判断回文*/ 
    #include<cstdio>
    #include<cstring>
    const int maxn = 256;
    
    bool judge(char str[]){
        int len = strlen(str);
        for(int i = 0; i < len / 2; i++){
            if(str[i] != str[len - 1 - i]){ //关键 
                return false;//不是回文 
            }
        }
        return true; 
    }
         
    int main(){
        char str[maxn];
        while(gets(str)){ //不断输入字符串 
            bool flag = judge(str); //判断字符串str是否是"回文串"
            if(flag == true){
                printf("YES
    "); 
            } else {
                printf("NO
    ");
            }
        }
        return 0;
    } 
    判断回文
    /*说反话(倒序输出英语句子)*/ 
    #include<cstdio>
    #include<cstring>
    int main(){
        char str[90];
        gets(str);// 按行读入 
        int len = strlen(str), row = 0, col = 0;
        char ans[90][90];
        for(int i = 0; i < len; i++){//逐字判断
            if(str[i] != ' ') {    //若不是空格,存放到ans[r]
                ans[row][col++] = str[i];
            }else{ //是空格,该单词结束
                ans[row][col] = '';//单词收尾
                row++; 
                col = 0; 
            }
        }
        for(int i = row; i >= 0; i--){ //倒着输出单词 
            printf("%s", ans[i]);
            if(i > 0) printf(" ");
        }
        return 0;
    }
    说反话

    第三章结束,下一篇开始第四章。

    第四章是算法初步,即一些简单的算法如排序/散列/递归/贪心/二分等。

    再展望下第五章是讲一些简单的数学问题。

    加油

  • 相关阅读:
    P3952 [NOIP2017 提高组] 时间复杂度
    1905. 统计子岛屿
    1102 Invert a Binary Tree (25 分)
    P1077 [NOIP2012 普及组] 摆花
    P3915 树的分解
    P1045 [NOIP2003 普及组] 麦森数
    P4961 小埋与扫雷
    P1123 取数游戏
    P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins
    CF1059B Forgery
  • 原文地址:https://www.cnblogs.com/cc1997/p/13050119.html
Copyright © 2020-2023  润新知