[啃书] 第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;
}
说反话

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

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

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

加油

原文地址:https://www.cnblogs.com/cc1997/p/13050119.html