1、字符串逆序
编写一个函数reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印
要求:不能使用C函数库中的字符串操作函数
比如:
char arr[ ]="abcdef";
逆序之后数组的内容变成:fedcba
第一次代码:
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//左下标//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.int right = strlen(arr) - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s\n", arr);return 0;
}
sizeof计算字符串包含\0;strlen计算字符串不包含\0,且还要包含头文件string.h。
sizeof不可以用在主函数之外;strlen可以用在主函数之外。
写成函数的方式:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
void reverse(char arr[])
{//int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//左下标//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.int right = strlen(arr) - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}
递归实现:
可以看成拆成两部分,假设是逆序abcdef,首先交换a和f的位置,再逆序bcde,然后再把bcde看成一个字符串,也就是逆序字符串bcde,交换b和e,再把cd看成一个字符串。。。。。。
1、设置一个中间变量tmp,把a传给tmp,f传给a,此时本来应该是把tmp里面的a传给f,但是如果把tmp里面的a传给f,中间的部分bcde就不能看成一个字符串了,因为字符串是以\0结束的,所以,应该是先把\0传给f,那从b开始,看到的bcde\0就是一个字符串了,这个时候从中间开始的字符串就又可以用reverse把它逆序了,把中间的逆序成edcb的时候,再把tmp里面的a拿上来放到这最开始f的地方。
还差个停止递归的条件,其实就是看最后中间字符串的长度。
#include<stdio.h>
#include<string.h>
void reverse(char* str)
{char tmp = *str;//1int len = strlen(str);//字符串长度*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置 ,2*(str + len - 1) = '\0';//3if(strlen(str+1)>=2)reverse(str + 1);//4*(str + len - 1) = tmp;//最后
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}
题目中不能使用C函数,这里用了strlen,就自己实现一个。
参考答案:
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}
void reverse(char* str)
{char tmp = *str;//1int len = my_strlen(str);//字符串长度*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置 ,2*(str + len - 1) = '\0';//3if(strlen(str+1)>=2)reverse(str + 1);//4*(str + len - 1) = tmp;//最后
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}
如果参数给的多:
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}
void reverse(char arr[], int left, int right)
{char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;if (left+1 < right-1)reverse(arr, left+1 , right-1);
}int main()
{char arr[] = "abcdef";int left = 0;int right = my_strlen(arr) - 1;reverse(arr,left,right);printf("%s\n", arr);return 0;
}
2、计算和
计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。
例如:调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729 ,输出:19
假设输入1234
那DigitSum(1234)的话,这个4很容易得到,那就把4拆出来,先算DigitSum(123)然后再加上4,
然后算DigitSum(12)再加上3加上4,再拆成DigitSum(1)+2+3+4,这个时候1没法拆了,它的每一位数之和就是它自己,
#include<stdio.h>
int DigitSum(unsigned int n)//1234
{if (n > 9)//这个n是两位数return DigitSum(n / 10) + n % 10; //n/10去掉个位数,n%10就是得到n的个位数elsereturn n;
}
int main()
{unsigned int n = 0;scanf("%u", &n);int sum=DigitSum(n);printf("%d\n", sum);return 0;
}
3、次方
递归实现n的k次方
题目:
编写一个函数实现n的k次方,使用递归实现。
#include<stdio.h>
//Pow(n,k) ->n*Pow(n,k-1)
//k=0 => n=1
//k>0 => n=Pow(n,k) ->n*Pow(n,k-1)
//k<0 =>1.0/Pow(n,-k)
double Pow(int n, int k)
{if (k > 0)return n * Pow(n, k - 1);else if (k == 0)return 1;elsereturn 1.0 / Pow(n, -k);
}
int main()
{int n = 0;int k = 0;scanf("%d%d", &n, &k);double ret=Pow(n,k);printf("%f\n", ret);return 0;
}
4、交换数组
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
#include<stdio.h>
int main()
{int arr1[] = { 1,3,5,7,9 };int arr2[] = { 2,4,6,8,0 };int i = 0;int sz = sizeof(arr1) / sizeof(arr1[0]);for (i = 0; i < sz; i++){int tmp=arr1[i];arr1[i] = arr2[i];arr2[i] = tmp;}for (i = 0; i < sz; i++){printf("%d ", arr1[i]);}printf("\n");for (i = 0; i < sz; i++){printf("%d ", arr2[i]);}return 0;
}
5、数组操作
创建一个整型数组,完成对数组的操作
1、实现函数init(),初始化数组全为0
2、实现print(),打印数组的每一个元素
3、实现reverse(),函数完成数组元素的逆置
要求:自己设计以上函数的参数,返回值
#include<stdio.h>
void init(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = 0;}
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
void reverse(int arr[], int sz)
{int left = 0;int right = sz - 1;while (left < right){int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);reverse(arr, sz);print(arr, sz);init(arr,sz);print(arr, sz);return 0;
}