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

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

题目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.csdn.net/u011954296/article/details/51029600)学习到这个递归的方法。加深了我对递归的理解,通过这个题学会了借这类题的思路,只要清楚递归体和递归出口就好理解了。

发布了35 篇原创文章 · 获赞 7 · 访问量 3187

猜你喜欢

转载自blog.csdn.net/weixin_44358097/article/details/91125901