-
一.题目分析及递归模型
题目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;
}
-
四.调试,测试及运行结果截图
调试:
测试:
运行结果: