目录
①、递归正序输出整数
②、递归逆序整数并返回
③、递归实现十进制转二进制
④、英语单词排序(编辑)
⑤、输出月份英文名
①、递归正序输出整数
题述:给一个正整数n,请利用递归按顺序输出它的每位数,输出一位数就换一下行
思路:与递归逆序输出整数大差不差,思路转变一下就可以
#include <stdio.h>
void printdigits(int n)
{
if (n / 10 == 0)
{
printf("%d\n", n % 10);
//当只有一位数的时候,开始输出
}
else
{
printdigits(n / 10);
printf("%d\n", n % 10);
//把这两行代码位置交换一下就会成为逆序输出,否则就是正序输出
//本题这么写是正序输出
}
}
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
②、递归逆序整数并返回
题述:递归实现逆序输出整数:编写实现对一个整数进行逆序处理的递归函数,函数需要有返回值,其值为逆序后的数据
思路:这道题难就难在你这个函数要返回这个逆序后的数,其次为逆序,正序会了,逆序只要调整一下思路就会了。那么如何返回逆序的数呢?怎么在每次函数调用时保持这个逆序后的数呢?用全局变量!
#include<stdio.h>
#include<math.h>
int temp = 0;//全局变量
int reverse(int n)
{
int cnt = 0, count = -1;
int t = n;
while (t)
{//求位数会改变原数,所以要用临时数据保存来求位数
t /= 10;
count++;
}
if (n / 10 == 0)
{
temp += n % 10;
}
else
{
cnt = pow(10, count--);
temp += cnt * ( n % 10);
reverse(n / 10);
}
return temp;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("逆序后的数为%d\n", reverse(n));
return 0;
}
③、递归实现十进制转二进制
题述:输入一个正整数n,设计dectbin函数,利用递归原理将十进制转为二进制
思路:递归终止条件应该是n/2==0为真时,因为正好可以实现逆序输出,然后返回上一个函数调用,再打印n%2,一直递归,直到回到最原始的状态n。函数调用完毕
#include <stdio.h>
void dectobin(int n)
{
if (n / 2 == 0)
{//函数终止条件,也就是这个10进制分解到最后需要开始输出
//因为这样正好可以保证是逆序输出的
printf("%d", n % 2);
return;
}
else
{
dectobin(n/2);
printf("%d", n % 2);
}
}
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
④、英语单词排序()
题述: 英语单词排序:输入若干有关颜色的英语单词(单词数小于20,每个单词不超过10个字母),每行一个。以“#”作为输入结束标志,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
思路:
1、创建二维数组,因为可以拆成,最多有20个元素的一维数组(因为你最多输入20个单词),其中每个单词最多10个字母,也就是这个一维数组长度设置为10。
2、再创建一个数组,他也是10个长度,因为排大小的时候,这个数组可以临时用来放数据
3、涉及字符串的比较问题,那么就不能用>或<号来直接比较,必须用字符串比较函数strcmp,用冒泡排序完成比较,(通过调用strlen函数比较大小,来决定是否换位置)
#include<stdio.h>
#include<string.h>
int main()
{
char word[20][10];//等价于20个一维数组,每个数组10个元素
char temp[10];
int i = 0, j = 0, k = 0;
for (i = 0; i < 20; i++)
{
gets(word[i]);
if (strcmp(word[i], "#") == 0)
break;//到了结束符直接退出就好
}
//冒泡排序
for (j = 0; j < i - 1; j++)
{
for (k = 0; k < i - 1 - j; k++)
{
if (strlen(word[k]) > strlen(word[k + 1]))
{//通过长度比较大小,改变word数组中的位置
//完全不需要再创建一个长度数组
strcpy(temp, word[k]);
strcpy(word[k], word[k + 1]);
strcpy(word[k + 1], temp);
}
}
}
for (j = 0; j < i; j++)
{
printf("%s\n", word[j]);
}
return 0;
}
⑤、输出月份英文名
题述:输出月份英文名:输入一个月份,输出对应的英文名称,要求用指针数组表示12个月的英文名称。如果月份不合法,函数直接返回NULL
思路:写一个函数,接收月份。然后通过创建指针数组保存所有的月份,然后返回对应的月份,函数返回类型char*
#include <stdio.h>
char* getmonth(int n)
{
char* month[13] = {NULL,
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December" };
if (n <= 0 || n > 12)
{
return NULL;
}
else
{
return month[n];
}
}
int main()
{
int n;
char* s;
scanf("%d", &n);
s = getmonth(n);
if (s == NULL) printf("wrong input!\n");
else printf("%s\n", s);
return 0;
}