C语言-程序初阶的练习

字符串逆序

编写一个函数 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值