计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
解题思路
代码如下
#include<stdio.h> int DigitSum(int n) { if (n>9) { return DigitSum(n / 10) + n % 10; } else { return n; } } int main() { int n = 0; scanf("%d", &n); int ret=DigitSum(n); printf("%d", ret); return 0; }
运行结果
字符串逆序(递归实现)
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
**要求:**不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
解题思路
在使用库函数的情况下
用左边的地址中的内容和最右边的地址中的内容交换
使用库函数strlen计算字符的长度
使用递归的方式实现
代码如下
使用库函数,并且不是递归方式的实现
#include<stdio.h> #include<string.h> void reverse_string(char *p) { char* l = p; char *r = p+strlen(p) - 1; while (l<r) { char temp = *l; *l = *r; *r = temp; r--; l++; } } int main() { char arr[] = "abcedfg"; reverse_string(arr); printf("%s\n", arr); return 0; }
不使用库函数,用递归方法实现
#include<stdio.h> //计算字符串的长度 int My_strlen(char* p) { int count = 0; while (*p) { count++; p++; } return count; } //字符串逆序 void reverse_string(char* p) { int len = My_strlen(p); char temp = p[0]; p[0] = p[len - 1]; p[len - 1] = '\0'; if (My_strlen(p+1)>=2) { reverse_string(p + 1); } p[len - 1] = temp; } int main() { char arr[] = "abcedfg"; reverse_string(arr); printf("%s\n", arr); return 0; }
运行结果
使用循环的方式实现的结果
使用递归的方式实现的结果
交换数组
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
解题思路
创立两个数组
创建一个临时变量用来交换数组中的元素
代码如下
#include<stdio.h> int main() { int a[5] = { 1,2,3,4,5 }; int b[5] = { 6,7,8,9,10 }; puts("交换前"); printf("数组a:"); for (int i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); printf("数组b:"); for (int k = 0; k < 5; k++) { printf("%d ", b[k]); } printf("\n"); for (int i = 0; i < 5; i++) { int temp = b[i]; b[i] = a[i]; a[i] = temp; } puts("交换后"); printf("数组a:"); for (int i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); printf("数组b:"); for (int k = 0; k < 5; k++) { printf("%d ", b[k]); } printf("\n"); return 0; }
运行结果
对一个整型数组进行冒泡排序
实现整型数组的冒泡排序
解题思路
使用两个循环
外层循环控制冒泡排序的顺序
里层循环交换内容
代码如下
#include<stdio.h> void BubbleSort(int* p, int sz) { for (int i = 0; i < sz-1; i++) { for (int j = 0; j < sz-i; j++) { if (p[j - 1] > p[j]) { int temp = p[j - 1]; p[j - 1] = p[j]; p[j] = temp; } } } } int main() { int arr[10] = { 12,45,3,61,13,56,96,46,123,456 }; int sz = sizeof(arr) / sizeof(arr[0]); BubbleSort(arr, sz); for (int i = 0; i < sz-1; i++) { printf("%d", arr[i]); } return 0; }
运行结果
交换两个变量
不允许创建临时变量,交换两个整数的内容
解题思路
可以通过^的方式来交换两个变量
代码如下
#include<stdio.h> int main() { int a = 10; int b = 20; printf("交换前:\na=%d,b=%d", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("\n交换后:\na=%d,b=%d", a, b); return 0; }
统计二进制中一的个数
写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
解题思路
通过%2==1来确定二进制中是否是1
然后再/2才符合二进制的规则
代码如下
#include<stdio.h> int count_one_bit(int n) { int count = 0; while (n) { if (n%2!=0) { count++; } n = n / 2; } return count; } int main() { int n = 0; scanf("%d", &n); int ret=count_one_bit(n); printf("%d", ret); return 0; }
运行结果
打印二进制中的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。
解题思路
- 提取所有的奇数位,如果该位是1,输出1,是0则输出0
- 以同样的方式提取偶数位置
代码如下:
#include<stdio.h> void Printbit(int n) { int i = 0; //打印偶数位 for ( i = 31; i >= 1; i-=2) { printf("%d ", (n >> i) & 1); } printf("\n"); //打印奇数位 for (i = 30; i >= 0; i -= 2) { printf("%d ", (n >> i) & 1); } printf("\n"); } int main() { int n = 0; scanf("%d", &n); Printbit(n); return 0; }
运行结果