一、题目分析
- 将非负十进制整n转换成b进制(其中b = 2~16)
- 将任意正整数n用2的幂次方表示
二、算法设计
1、转换进制问题:exer.cpp
递归算法
递归出口:n / b < b
递归表达式:f(n,b)=f(n/b,b) (n/b>=b)
递归栈表示;
2、用二的幂次方表示任意正整数n问题:exer2.cpp
递归算法
递归出口:f(n)=1或f(n)=0或f(n)=2
递归表达式:f(n)=f(logn/log2)+f(n-pow(2,logn/log2)) (logn/log2>2)
递归栈表示:
三、源代码
1、数值转换问题
递归:
#include <iostream>
using namespace std;
void NumSystemConversion(int a,int b)
{
char str[] = {"0123456789ABCDEF"};
if(a / b >= b)
{
NumSystemConversion(a / b,b);
}
else{
cout << str[a / b];
}
cout << str[a % b];
}
void main() {
int n,b;
cout << "请输入任意非负十进制整数:";
cin >> n;
cout << "请输入想要转换的数制:";
cin >> b;
cout << "转换后的结果为:";
NumSystemConversion(n,b);
cout << endl;
}
非递归:
#include <iostream>
using namespace std;
void main()
{
int n,b;
char str[] = {"0123456789ABCDEF"};
char temp[10];
cout << "请输入任意非负十进制整数:";
cin >> n;
cout << "请输入想要转换的数制:";
cin >> b;
cout << "转换后的结果为:";
int i =0;
bool bl = true;
while(bl)
{
if(n / b >= b)
{
temp[i] = str[n % b];
n = n / b;
i++;
}
else
{
cout << str[n / b];
cout << str[n % b];
bl = false;
}
}
while(i-- > 0)
{
cout << temp[i];
}
cout << endl;
}
2.用2的幂次方表示任意正整数问题
递归;
#include <stdio.h>
#include <math.h>
void conversion(int n);
void main()
{
int n;
printf("请输入任意正整数:");
scanf("%d",&n);
printf("转换后输出:");
conversion(n);
printf("\n");
}
void conversion(int n)
{
int y,temp;
y = log(n) / log(2);
if(y > 2)
{
printf("2(");
conversion(y);
printf(")");
}
else if(y == 1)
{
printf("2");
}
else
{
printf("2(%d)",y);
}
temp = n - pow(2,y);
if(temp > 0)
{
printf("+");
conversion(temp);
}
}
四、运行结果
1、
2、