首先今天有点迟了,原因就是去看了一下别的大佬的有关十六进制转八进制的博客,看的我现在人都有点不正常,要不是我目前还不会写,我觉得有的博主的写法我属实不能理解,等我哪天研究会了,……
1.第一题:(直接来一个十六进制转八进制),虽然目前还不是很懂
#include<stdio.h> #include<string.h> char h[100002], b[400002], e[400002]; int main() { int n, j; scanf("%d", &n); while (n--) { scanf("%s", h); int i, len = 0; for (i = strlen(h) - 1; i >= 0; i--) { int v; if (h[i] >= '0' && h[i] <= '9') v = h[i] - '0'; else v = h[i] - 'A' + 10; for (j = 0; j < 4; j++) { b[len++] = v % 2 + '0'; v /= 2; } } b[len] = '\0'; int x = 0, cnt = 1; int l = 0; for (i = 0; i < len; i++) { if (cnt == 4 || i == len - 1) { x = cnt * (b[i] - '0') + x; cnt = 1; e[l++] = x + '0'; x = 0; } else { x = cnt * (b[i] - '0') + x; cnt *= 2; } } i = l - 1; while (i >= 0 && e[i] == '0') i--; if (i < 0) printf("0"); for (; i >= 0; i--) { printf("%c", e[i]); } printf("\n"); } return 0; }
2.第二题:
#include<stdio.h> int main() { int i, j, n, m; scanf("%d%d", &n, &m); char ch[100][100]; for (i = 0; i < n; i++)//行 { //然后就是利用这个字母图形的规律来解题了 if (i == 0)//二维数组的角度来看,此时的这个意思就是第一行的每一个元素 { for (j = 0; j < m; j++)//列(列,也就是控制第一行的每一个元素) { //这边没人叫你是输入一个字符串,让你去排序(不敢太搞笑),这边只是想要a到某个字母而已 //所以这边可以直接给这个二维数组进行赋值(就是有点像杨辉三角那样,利用图形规律,对这个图形直接进行赋值操作,充分可以看出你没有真正的掌握杨辉三角的真谛) ch[0][j] = 'a' + j;//这步就是充分去利用了什么是ascii码值(当然你也可以不写a ,直接写ascii码值也是一样的) } } else { for (j = 0; j < m; j++) { //并且此时把这个二维数组的第一行给赋值完成后,这边还有两种情况 if (j == 0) { ch[i][0] = ch[i - 1][0] + 1; } else { ch[i][j] = ch[i - 1][j - 1]; } } } } //以上这个for循环就把我的二维数组中的每一个元素都给搞定了 //所以这边就可以对二维数组进行打印了 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("%c",ch[i][j]);//这边是打印字符(不敢写成打印整形了,不然就完了) } //上述为打印一行 //所以要进行下一行的打印这边就要有有个换行 printf("\n"); } return 0; }
3.第三题:
#include<stdio.h> int main() { int m, n; int i, j, tmp; char ch[10][10] = {0}; scanf("%d %d",&n,&m);//这个输入就是输入n行n列的意思 //这下就是具体的原理实现 for (i = 0; i < n; i++)//n行 5 { for (j = 0; j < m; j++)//这个表示每一行有几个元素,也就是有几列的意思 4 { scanf("%c", &ch[j]);//这个表示我要输入的字符 for (i = 0; i <n-1 ; i++) { tmp = ch[i + 1]; //ch[m - 1 - i] = ch[m - 1 - 1 - i]; ch[i+1] = ch[i]; } ch[j] = tmp; } printf("%c", ch[i]); } return 0; }
4.第四题:(复习二分查找)
#include<stdio.h> int search(int arr[], int k, int sz) { //这个好像就是这样的,这个就是为了算这个数组中有几个元素而已 int left = 0; int right = sz - 1;//这个就是最后一个元素的下标 //接下来就是一个牛白的算法(二分查找法的经典一步) int mind = 0; while (left <= right) { mind = (left + right) / 2; if (k > arr[mind])//要记住几边的mind只是一个数组的下标,所以此时要把它放到数组中去 { left = mind + 1; } else if (k < arr[mind]) { right = mind - 1; } else { return mind; } } return 10; } int main() { int ret; int n; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("请输入你要查找的数:"); scanf("%d",&n); int sz = sizeof(arr) / sizeof(arr[0]); ret = search(arr, n, sz); if (ret == 10) { printf("找不到\n"); } else { printf("找到了,下标是:%d", ret); } return 0; }
5.第五题:(复习迭代)
#include<stdio.h> int main() { int i, j, n; int a = 1, b = 1, c; printf("请输入你想知道的第几个斐波那契数列:"); scanf("%d",&n); while (n> 2) { c = a + b; a = b; b = c; n--; } printf("%d",c); return 0; }
6.第六题:(寻找一个数组中缺少的某个数)
#include<stdio.h> int main() { int i, j, n; int m = 0; int arr[10] = { 0,1,2,3,4,5,6,7,8,10 }; for (i = 0; i <= 10; i++) { m ^= i;//这步搞定之后我的m中就有了这个arr中的所有数字了 } printf("%d\n",m); for (i = 0; i < 10; i++) { m ^= arr[i]; } printf("%d",m); return 0; }
7.第七题:(复习三步翻转法)(区别于各类数据翻转)
#include<stdio.h> void reverse(int arr[], int left, int right)//下次这边要去用指针,因为你已经很久没有用指针去写了,不敢把指着给忘记掉 { //这个函数这样写是属于一个下标的使用 //所以当我们在进行元素位置的交换时一共有两种方法(一个使用下标进行交换,一个就是用指针,直接进行指针位置的交换)(这两种方法千万不敢混在一起用,不然真的是会完蛋的) //所以总的来说,旋转这一块知识中可以使用的方法种类非常的多,千万不敢混在一起了 int tmp; while (left<right) { tmp = arr[left];//如果这边想要写成指针的话,这边就应该把left和right变成指针,直接进行指针位置的交换 arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } int main() { int i, j, n; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); printf("请输入你要旋转的元素的个数:"); scanf("%d",&n);//假如此时我要旋转5次(也就是最后要得到 6,7,8,9,10,1,2,3,4,5)这样的序列 //这个位置一定要注意下标,千万不敢越界了 //并且要注意当我的旋转个数大于我的元素个数时,我的程序就是有问题的 //所以为了使我的代码完美(不出错),所以这边一定还要加一个条件上去 if (n >= sz) { n %= sz;//例如此时我的这个n=sz=10,此时%一下就是想当与不进行旋转(确实是不需要旋转的,因为就算旋转10次,它其实还是原来的那个东西,当n大于sz时(15)所以此时就还是旋转5次,如果不进行%这个条件,就会导致我们下面的代码出问题,因为会越界) } reverse(arr,0,sz-n-1);//这步就是我要逆置我的那些本来不需要逆置的数 reverse(arr,sz-n-1, n-1);//这步的意思就是表示我要逆置我本来就需要逆置的数 reverse(arr,0, sz-1);//这步就是表示我将我的整个数组都给逆置一下(并且此时这样的逆置方法是属于左右逆置)前sz-k个先逆置,后k个逆置,最后所有元素逆置 for (i = 0; i < sz; i++) { printf("%d ",arr[i]); } return 0; }
8.第八题:(复习冒泡排序)
#include<stdio.h> int main() { int arr[100] = { 1,2,3,4,5,6,7,8,9,10 }; int i, j, n; int tmp = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); for (i = 0; i < 9; i++)//这边就是为了控制数组中的每一个数而已 { for (j = 0; j < 9-i; j++)//这个就是为了控制每一个数的交换的次数 { tmp = arr[j]; arr[j] = arr[j+1]; arr[j + 1] = tmp; } } for (i = 0; i < 10; i++) { printf("%d ",arr[i]); } return 0; }
9.第九题:(复习杨氏矩阵)
#include<stdio.h> int Findname(int arr[][6], int n, int* px, int* py)//因为下面传上来的是两个地址,所以这边我也可以用我的指针来接收 { int x = 0; int y = *py - 1; while (x <= *px - 1 && y>=0) { if (arr[x][y]<n) { x++; } else if (arr[x][y] > n) { y--; } else { *px = x; *py = y; return 1; } } *px = -1; *py = -1; return 0; } int main() { int arr[3][6] = { {1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18} }; int n; int ret = 0; int x = 3; int y = 6; printf("请输入你要查找的数字:"); scanf("%d", &n); //有了我需要查找的数了,此时我就要把二维数组的坐标给弄出来 //我们这边也可以直接包装一个函数 ret = Findname(arr, n, &x, &y); if (1 == ret) { printf("找到了,该数的下标是:(%d ,%d)",x,y); } else { printf("找不到你想要的数!(%d ,%d)", x, y); } return 0; }
10.第十题:(复习杨氏三角)
#include<stdio.h> int main() { int arr[100][100] = { 0 }; int i, j, n; printf("请输入你需要的杨氏三角的行数:"); scanf("%d", &n); for (i = 0; i < n; i++)//此时这个就是表示控制行数 { for (j = 0; j < i; j++)//据杨氏三角特征n行就有n个元素(所以此时这个j变量就是用来控制每一行的元素的个数的,所以用j<i来控制) { if (0 == j || i == j)//根据特性 { arr[i][j] = 1; } else { arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; } } } //将数组利用特性赋值完,此时就是打印出来 for (i = 0; i < n; i++) { for (j = n; j > i + 1; j--) { printf(" "); } for (j = 0; j < i; j++) { printf("%-6d",arr[i][j]); } printf("\n"); } return 0; }
这个图片好看,每天看一遍
11.今天题目就到这吧!