前言
第三章——入门模拟
模拟:“题目怎么说,你就怎么做”
本章内容较少较基础,不仅是熟悉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] = '