pta(浙大第四版)五道经典练习题②

目录

①、递归正序输出整数

②、递归逆序整数并返回

③、递归实现十进制转二进制

④、英语单词排序(​编辑)

⑤、输出月份英文名


①、递归正序输出整数

题述:给一个正整数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;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值