💕"痛苦难以避免,而磨难可以选择。"-->村上春树💕
作者:Mylvzi
文章主要内容:数据在内存中的存储
1.有序序列判断
题目描述:
分析过程:
代码实现:
#include <stdio.h> int main() { //定义个数 int n = 0; scanf("%d",&n); //循环输入数字 int arr[n]; int i = 0; for(i=0; i<n; i++) { scanf("%d",&arr[i]); } //判断 int flag1 = 0;//判断升序 int flag2 = 0;//判断降序 for(i=0; i<n-1; i++) { if(arr[i] <arr[i+1]) flag1 = 1; else flag2 = 1; } //如果为unsorted flag1+flag2==2 if(flag1 + flag2 == 2) { printf("unsorted"); } else { printf("sorted"); } return 0; } /*第二种写法,边输入,边判断*/ #include <stdio.h> //边输入,边判断 int main() { //定义个数 int n = 0; scanf("%d",&n); //循环输入数字 //判断 int flag1 = 0;//判断升序 int flag2 = 0;//判断降序 int arr[n]; int i = 0; for(i=0; i<n; i++) { scanf("%d",&arr[i]); if(i>=1)//只要输了一个元素之后,输入一个就和前面已经输入的数字进行比较 { if(arr[i] <arr[i-1]) flag1 = 1; else flag2 = 1; } } if(flag1 + flag2 == 2) { printf("unsorted"); } else { printf("sorted"); } return 0; }
2.获得月份天数
题目描述:
分析过程:
代码实现:
/*第一种写法,最直观的*/ #include <stdio.h> int main() { int y, m; while (scanf("%d %d", &y, &m) != EOF) { switch (m) { //第一种情况 case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("31\n"); break; //第二种情况 case 4: case 6: case 9: case 11: printf("30\n"); break; //二月的情况 要判断是否是闰年 default: if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) printf("29\n"); else printf("28\n"); } } return 0; } /*第二种方法,漂亮的代码*/ #include <stdio.h> //判断是否为闰年 int is_leap_year(int y) { if((y%4==0 && y%100!=0 ) || (y%400==0)) return 1; else return 0; } //获取天数 int get_days_of_month(int y,int m) { //使用数组来存放对应的天数 int d = 0; int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; d=day[m]; if(m==2) { if(is_leap_year(y)==1) d+=1; } return d; } int main() { //输入年份和月数 int y = 0; int m = 0; while(scanf("%d %d",&y,&m)==2) { int d = get_days_of_month(y,m); printf("%d\n",d); } return 0; }
3.矩阵相等判定
题目描述:
分析过程:
代码实现:(第二种方法要学习)
方法一:
#include <stdio.h> //BC105 //方法一 //判断矩阵是否相等->大小相等,但对应元素未知 int main() { //定义矩阵大小 int n = 0; int m = 0; scanf("%d %d", &n, &m); //两个矩阵的赋值 int arr1[n][m]; int arr2[n][m]; int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr1[i][j]); } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr2[i][j]); } } //判断是否相等 int flag = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (arr1[i][j] != arr2[i][j]) { flag = 1; } } } if (1 == flag) { printf("No\n"); } else { printf("Yes\n"); } return 0; }
方法2:(很不错的一个方法)(main函数也是函数,把它看作一个普通的自定义函数,只有一个返回值)
//BC105 //判断矩阵是否相等->大小相等,但对应元素未知 int main() { //定义矩阵大小 int n = 0; int m = 0; scanf("%d %d", &n, &m); //两个矩阵的赋值 int arr1[n][m]; int arr2[n][m]; int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr1[i][j]); } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr2[i][j]); if (arr2[i][j] != arr1[i][j]) { printf("No\n"); return 0; } } } printf("Yes\n"); return 0; } //BC106上三角形矩阵判定 int main() { //定义方阵大小 int n = 0; scanf("%d",&n); //方阵赋值并判断 int arr[n][n]; int i = 0; int j = 0; for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",&arr[i][j]); if(j<i)//下对角线的条件,j<i { if(arr[i][j] != 0) { printf("NO\n"); return 0; } } } } printf("YES\n"); return 0; }
4.矩阵交换
题目描述:
代码实现:
#include <stdio.h> //BC108 矩阵交换 int main() { //定义矩阵大小 int n = 0; int m = 0; scanf("%d %d", &n, &m); //矩阵赋值 int i = 0; int j = 0; int arr[n][m]; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr[i][j]); } } //输入进行变幻的次数 int k = 0; scanf("%d", &k); //分三种情况进行操作 int a = 0;//a仅仅是用来循环次数 while (a < k) { //先定义要执行的操作 char ope = 0; //定义具体位置 int x = 0; int y = 0; while (getchar() != '\n'); scanf("%c %d %d", &ope, &x, &y); switch (ope) { case 'r'://行操作 for (j = 0; j < m; j++) { int temp = arr[x-1][j]; arr[x-1][j] = arr[y-1][j]; arr[y-1][j] = temp; } break; case 'c'://列操作 for (i = 0; i < n; i++) { int temp = arr[i][x-1]; arr[i][x-1] = arr[i][y-1]; arr[i][y-1] = temp; } break; default://不进行操作 break; } a++; } //输出变换后的矩阵 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
5.井字棋判断输赢
题目描述:
代码实现:
#include <stdio.h> //BC110 //判断输赢函数 int is_winner(char arr[3][3], int row, int col) { int x = 0; int y = 0; char flag = 0; //row for (x = 0; x < row; x++) { if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] == arr[x][2]) flag = arr[x][0]; } //col for (y = 0; y < col; y++) { if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[0][y] == arr[2][y]) flag = arr[0][y]; } //对角线 if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] == arr[2][2]) { flag = arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] == arr[2][0]) { flag = arr[0][2]; } return flag; } int main() { //用二维数组填充棋盘 char arr[3][3]; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scanf("%c", &arr[i][j]); getchar();//处理的是字符,注意要清理缓冲区 } } //判断输赢 char ret = is_winner(arr, 3, 3); if (ret == 'K') { printf("KiKi wins!"); } else if (ret == 'B') { printf("BoBo wins!"); } else { printf("No winner!"); } return 0; }
总结:使用flag标记这种做法是一种很常见的C语言编程过程中使用到的技巧
6.递归进行进制转换
题目描述:
分析过程:
代码实现:
#include <stdio.h> //BC111 //直接打印出来 void print(int num) { if (num > 5)//保证num<6 { print(num / 6); } printf("%d", num % 6); } int main() { int num = 0; scanf("%d", &num); print(num); return 0; }
画图理解递归过程:(推出去,再归回来)