目录
加减混合运算
计算n的k次方
计算非负整数各位之和
字符串逆序
双指针
递归
矩阵计算
矩阵转置
加减混合运算
题目:计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果。
一般情况我们可以写个循环然后在用条件判断语句对两种情况进行判断,但这里有个更优质的办法,设置一个开关变量在正数和负数进行切换即可。
int flag = 1;double sum = 0;for (int i = 1; i < 100; i++){sum += flag* (1.0 / i);//注意小数flag = -flag;}printf("%lf", sum);
在计算分数时,除数和被除数至少有一个是小数,否则会被当成整数运算
计算n的k次方
三种情况(递归)
- n < 0, 1.0 / Pow(n, -k)(利用正向递归后变为倒数)
- n > 0, n* Pow(n,k-1)
- n = 0, 1
double Pow(int n, int k)
{if (k < 0){return 1.0 / n * Pow(n, -k);}else if (k == 0){return 1;}else return n * Pow(n, k - 1);
}
int main()
{int n = 0;int k = 0;scanf("%d %d", &n, &k);double ret = Pow(n, k);printf("%lf\n", ret);return 0;
}
计算非负整数各位之和
用递归从后往前依次拆分,直到只有一位数。
int DigitSum(unsigned int n)
{if (n < 10)return n;elsereturn DigitSum(n / 10) + n % 10;
}
int main()
{unsigned int num = 0;scanf("%u", &num);int sum = DigitSum(num);printf("%d\n", sum);return 0;
}
字符串逆序
给定一个字符假设abcdef,逆置成fedcba。
双指针
设置首尾指针,交换后往中间靠拢。
//下标
void reverse_string(char* str)
{int len = strlen(str);int left = 0;int right = len - 1;while (left<right){char tmp = *(str + left);*(str + left) = *(str + right);*(str + right) = tmp;left++;right--;}
}
//指针
void reverse_string(char* str)
{int len = strlen(str);char* left = str;char* right = str + len - 1;while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
递归
递归可能不容易想到,因为这是从两头递归到中间,结束条件即只剩一个数或没有数可以交换。递归怎么做到两头并进呢?这就要用到我们的\0了,当左边的数变为右边时,先不急着将左边的数换到右边,而是在右边位置补上一个\0,然后指针+1,形成递归,这样交换的时候就不用考虑\0后已交换的内容,实现正确逆置。
上图是递归的具体过程,从图可知,数组长度从手动替换\0开始计算(如果不满足条件就将\0替换成数字)。判断条件为数组长度大于1满足递归条件,但这是偶数的情况,如果是奇数,长度就是4,递归一次后变为2,此后不满足递归条件,所以正确判断条件应该是数组长度大于2
void reverse_string(char* str)
{int len = strlen(str);char* tmp = *str;*str = *(str + len - 1);*(str + len - 1) = '\0';if (*str > 2){reverse_string(str + 1);}*(str + len - 1) = 'tmp';
}
矩阵计算
矩阵打印用二维矩阵,在里层输入矩阵的值,判断大于0的数进行累加。
int n = 0;int m = 0;scanf("%d %d", &n, &m);int i = 0;int k = 0;int sum = 0;for (i = 0; i < n; i++){int j = 0;for (j = 0; j < m; j++){scanf("%d", &k);if (k >= 0)sum += k;}}printf("%d\n", sum);
矩阵转置
注意转置要先将值存放到二维数组里,然后从原先按行打印变为按列打印即可。
int n = 0;int m = 0;scanf("%d %d", &n, &m);//int arr[n][m];//c99int arr[10][10];int i = 0;int j = 0;for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &arr[i][j]);}}for (j = 0; j < m; j++){for (i = 0; i < n; i++){printf("%d ", arr[i][j]);}printf("\n");}
如果在一些刷题网站上,我们可以直接使用变长数组初始化数组,如果不使用变长数组,可以直接设置数组大小为题目规定的最大长度即可。