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;//1
int len = strlen(str);//字符串长度
*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置 ,2
*(str + len - 1) = '\0';//3
if(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;//1
int len = my_strlen(str);//字符串长度
*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置 ,2
*(str + len - 1) = '\0';//3
if(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的个位数
else
return 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;
else
return 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;
}