- 实验内容
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
题目2:任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+2^0
同时约定幂次方用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+2^0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^10 +2^8 +2^5 +2+2^0
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入:正整数(n≤20000)
输出:符合约定的n的0,2表示(在表示中不能有空格)
输入格式 Input Format
一个正整数
输出格式 Output Format
符合约定的n的0,2表示(在表示中不能有空格)
样例输入 Sample Input
73
样例输出 Sample Output
2(2(2)+2)+2(2+2(0))+2(0) - 递归模型
- 递归栈
题目一:
4. 代码实现
1.题目一:
(1)递归实现:
#include <stdio.h>
#define N 100
char a[N]={'\0'};
int i=0;
void ChangeNum(int n,int b)
{
if(n==0){
return;
}
else{
ChangeNum(n/b,b);
if(n%b<10){
a[i++]=n%b+48; //在字符数组中存入ASCII码表中数字所代表的字符,如数字48代表字符'0'
}
else{
a[i++]=n%b+55;//在字符数组中存入ASCII码表中数字所代表的字符,如数字65代表字符'A'
}
}
}
int main(void)
{
int n,b;
printf("请输入非负十进制整数:");
scanf("%d",&n);
printf("请输入数字即转换为多少进制数(b=2~16):");
scanf("%d",&b);
ChangeNum(n,b);
for(int j=0;j<i;j++){
printf("%c",a[j]);
}
return 0;
}
(2)非递归实现:
#include <stdio.h>
#define N 100
static char a[N]={'\0'};
static int i=0;
void ChangeNum(int n,int b)
{
while(n){
if(n%b<10){
a[i++]=n%b+48; //在字符数组中存入ASCII码表中数字所代表的字符,如数字48代表字符'0'
}
else{
a[i++]=n%b+55;//在字符数组中存入ASCII码表中数字所代表的字符,如数字65代表字符'A'
}
n=n/b;
}
}
int main(void)
{
int n,b;
printf("请输入非负十进制整数:");
scanf("%d",&n);
printf("请输入数字即转换为多少进制数(b=2~16):");
scanf("%d",&b);
ChangeNum(n,b);
for(int j=i-1;j>-1;j--){
printf("%c",a[j]);
}
printf("\n");
return 0;
}
2.题目二:
递归实现
#include <iostream>
using namespace std;
/*
//n为操作数,r为递归深度
void fun(int n, int r)
{
//递归结束
if (1 == n)
{
cout<<"2("<<r<<")";
}
else
{
//n除以二,递归深度加1
fun(n/2, r+1);
//如果模2有余数,则为2^r
if (1 == n%2)
{
cout<<"+2("<<r<<")";
}
}
}
*/
//n为操作数,r为递归深度
void fun(int n, int r)
{
//递归结束,最先输出,不带+号
if (1 == n)
{
/*cout<<"2("<<r<<")";*/
//将r表示成0和2
switch(r)
{
//2^0,递归深度为0
case 0:cout<<"2(0)";break;
//2^1,递归深度为1
case 1:cout<<"2";break;
//2^2,递归深度为2
case 2:cout<<"2(2)";break;
//2^r,递归深度为r
default:
cout<<"2(";
fun(r,0);
cout<<")";
}
}
else
{
//n除以二,递归深度加1
fun(n/2, r+1);
//如果模2有余数,则为2^r
if (1 == n%2)
{
/*cout<<"+2("<<r<<")";*/
/*cout<<"2("<<r<<")";*/
//将r表示成0和2
switch(r)
{
//2^0,递归深度为0
case 0:cout<<"+2(0)";break;
//2^1,递归深度为1
case 1:cout<<"+2";break;
//2^2,递归深度为2
case 2:cout<<"+2(2)";break;
//2^r,递归深度为r
default:
cout<<"+2(";
fun(r,0);
cout<<")";
}
}
}
}
int main(void)
{
int num;
cout<<"请输入一个正整数:"<<endl;
cin>>num;
fun(num,0);
return 0;
}
- 测试及运行结果
题目一:
题目二:
- 经验总结
经过这次的程序设计,尤其是题目2,让我更加深刻地理解了递归的巧妙之处:化繁为简。让问题简单化,即先设计出一种解决方式,然后思考这种解决方式是否对所有情况通用,如果通用则用递归,那么问题就变得十分简单。虽然刚开始接触递归的时候,总是想不通为什么要这样写,但是慢慢地理解了递归,现在感觉递归不是很难了。