字符串逆序
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
参考代码:
非递归写法:
//字符串逆序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Strlen(char* str) {
int count = 0;
while (*str != '\0') {
count++;
str++;
}
return count;
}
void reverse_string(char* str) {
int l = 0;
int r = Strlen(str) - 1;
while (l < r)
{
char tmp = *(str + l);
*(str + l) = *(str + r);
*(str + r) = tmp;
l++;
r--;
}
}
int main() {
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
递归写法:
递归方式:
对于字符串“abcdefg”,递归实现的大概原理:
1. 交换a和g
2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr+len-1);
*(arr+len-1) = '\0';
if(strlen(arr+1)>=2)
reverse_string(arr+1);
*(arr+len-1) = tmp;
}
递归
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。
递归要有两个要素,结束条件与递推关系
*号输入
1.用C语言在屏幕上输出以下图案:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//打印菱形图案
int main() {
int line = 0;
scanf("%d", &line);
int i = 0;
for (i = 0; i < line; i++) {
//先打印空格
int j = 0;
for (j = 0; j < line - 1 - i; j++) {
printf(" ");
}
//先打印星号
for (j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
//下
for (i = 0; i < line - 1; i++) {
//先打印空格
int j = 0;
for (j = 0; j <= i; j++) {
printf(" ");
}
//先打印星号
for (j = 0; j < 2 * (line - 1 - i) - 1; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
可以通过输入不同的数值可以控制菱形的大小。
作业内容
水仙花数
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<math.h>
int main() {
int i = 0;
for (i = 1; i <= 10000000; i++) {
//判断是否为水仙花数
//1.计算i是几位数
int n = 0;
int tmp = i;
while (tmp) {
tmp /= 10;
n++;
}
//2.计算i的十进制的每一位的n次方之和,判断是否等于i本身
tmp = i;
int sum = 0;
while (tmp) {
sum += pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i) {
printf("%d", i);
}
}
return 0;
}