编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

题目要求:

编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

思路常规思路怎么反转一个字符串呢?对于常规函数和目前已知的思想来说,冒泡排序或者是不二之选了,所以这里想提一提一种新思路:双指针

双指针

通过定义两个指针p,q,一个指向数组的头部,一个指向数组的尾部,在循环之中不断去交换数组头部和尾部的内容,进行一次交换之后p指针向后进一,q指针向前减一。直到p,q指针相同或者p>q。

而对于递归来说要怎么处理呢?递归的思想一直是个难点,但在这题来说算是比较简单。为了得到反转的字符串,可以让数组尾部赋给一个新数组的头部,然后不断去递归这个操作即可解决。

这里说一下,是不可以用strcpy来拷贝自定义数组的,因为strcpy的函数原型只能是一个常量而不能是变量。strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc);

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 20
/*编写一个C程序,实现以下功能:
编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。
在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。
*/
void funcRecursion(char* str, int n) {
	int i = 0;
	i++;
	int strTmp[MAX];
	if (n == 1)
		return printf("%s",str);
	else {
		strTmp[i] = str[n];
		return funcRecursion(str, n - 1);
	}
}
void func(char* str, int n) {
	int p, q;
	p = 0, q = n;
	while (p <= q) {
		char tmp = str[p];
		str[p] = str[q];
		str[q] = tmp;
		p++; q--;
	}
	printf("%s", str);
}
int main() {
	char str[MAX];
	gets(str);
	strlen(str);
	func(str, strlen(str) - 1);//减一是为了减去‘\0’
	printf("\n");
	funcRecursion(str, strlen(str) - 1);
}

在C语言中,可以通过递归函数实现将十进制正整数转换为二进制数。递归的基本思想是将十进制数不断除以2,直到商为0,然后反向输出每一步的余数,这些余数组成的序列就是对应的二进制数。 以下是两种不同实现方式的代码示例: ### 实现方式一 ```c #include <stdio.h> void binary(int n) { if (n == 0) return; else { binary(n / 2); printf("%d", n % 2); } } int main() { int n; scanf("%d", &n); if (n == 0) printf("%d\n", 0); else binary(n); return 0; } ``` 这种实现方式在`binary`函数中,先递归调用自身处理`n / 2`,然后输出`n % 2`,也就是余数。当`n`为0时,递归结束。在`main`函数中,先读取用户输入的十进制数`n`,如果`n`为0,直接输出0,否则调用`binary`函数进行转换输出 [^2]。 ### 实现方式二 ```c #include <stdio.h> void convert(int n) { if (n > 1) { convert(n / 2); } printf("%d", n % 2); } int main() { int n; scanf("%d", &n); convert(n); return 0; } ``` 此实现方式中,`convert`函数里,当`n`大于1时递归调用自身处理`n / 2`,然后输出`n % 2`。在`main`函数中读取用户输入的十进制数并调用`convert`函数进行转换输出 [^3]。 ### 实现方式三(满足裁判测试程序样例要求) ```c #include <stdio.h> void dectobin(int n) { if (n > 1) { dectobin(n / 2); } printf("%d", n % 2); } int main() { int n; scanf("%d", &n); dectobin(n); return 0; } ``` 该实现方式定义了`dectobin`函数,其逻辑与上述两种类似,同样是通过递归不断将十进制数除以2,然后输出余数。在`main`函数中读取用户输入调用`dectobin`函数进行转换输出 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值