将非负十进制整数n转换成b进制。(其中b=2~16);任何一个正整数都可以用2的幂次方表示。ab 可表示为a(b)137=2(2(2)+2+2(0))+2(2+2(0))+2(0);

博客详细介绍了如何使用递归将非负十进制整数转换为2到16进制,以及如何用2的幂次方表示正整数。通过两个具体的例子解析了递归模型,讨论了递归出口和递归体,并分享了在解决此类问题中对递归理解的深入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 一.题目分析及递归模型

题目1:将非负十进制整数n转换成b进制。(其中b=2~16);

递归出口:n/b==0; 递归体的函数式change1(n / b,b); printf("%d", n % b);

题目2:任何一个正整数都可以用2的幂次方表示。ab 可表示为a(b)。由此可知,

137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0);

1315=2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0);

递归出口:1 == n ;递归体的函数式show(n / 2, r + 1);

       二.算法设计思路  

  •    

 

三.源代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
/**
*题目:1.将非负十进制整数n转换成b进制。
**     2.任何一个正整数都可以用2的幂次方表示。
*/
//递归实现进制的转换
void change1(int n, int b)
{
	//除以b直到操作数为0,然后倒数取余
	if (n != 0)
	{
		change1(n / b, b);
		printf("%d", n % b);
	}
}
//非递归实现进制的转换
void change2(int n, int b)
{
	int i = 1;
	int result = 0;
	while (n)
	{
		result += i * (n%b);
		n /= 2;
		i *= 10;
	}
	printf("%d\n", result); 
}
//n为操作数,r为递归深度
void show(int n,int r)
{
	//递归结束,最先输出
	if (1 == n)
	{
		switch (r)
		{
		case 0:printf("2(0)");
			break;
		case 1:printf("2");
			break;
		case 2:printf("2(2)");
			break;
		default:
			printf("2(");
			show(r, 0);	//将每一个括号里的数字都用2()表示
			printf(")");
		}
	}
	else
	{
		//n除以2递归深度加1
		show(n / 2, r + 1);
		if (1 == n % 2)
		{
			switch (r)
			{
			case 0:printf("+2(0)");
				break;
			case 1:printf("+2");
				break;
			case 2:printf("+2(2)");
				break;
			default:
				printf("+2(");
				show(r, 0);
				printf(")");
			}
		}
	}
}
int main()
{
	int n = 0;
	int b = 0;
	printf("请输入整数n和要转换的进制b:");
	scanf("%d %d", &n, &b);
	change1(n, b);
	printf("\n请输入一个小于20000的正整数:");
	scanf("%d", &n);
	show(n, 0);
	system("pause");
	return 0;
}

 

  • 四.调试,测试及运行结果截图

调试:

       

 

测试:

     

     

运行结果:

 

五.总结

       通过这次的作业再一次巩固了递归的学习,对递归进行了进一步的加深了解。尤其是第二题在一个if判断中会用到两个递归进行计算。刚开始在做第一个题的非递归时刚开始的思路是把每一步的结果放在数组中才能倒序输出,后来想到多定义一个变量来决定那一位的权值大小计算结果。第二题也是想了好久,在网上查询相关内容(https://blog.youkuaiyun.com/u011954296/article/details/51029600)学习到这个递归的方法。加深了我对递归的理解,通过这个题学会了借这类题的思路,只要清楚递归体和递归出口就好理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值