进制转换与2的幂次方
一、题目要求
题目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)
二、语言环境:c++/ VS
三、递归模型及递归栈
题目一:
f ( n u m , r , r e ) = { c o n v e r s i o n r e c u r s i v e ( n u m , r , r e ) = 1 n u m < r c o n v e r s i o n r e c u r s i v e ( n u m , r , r e ) n u m > = r f(num,r,re)=\left\{\begin{matrix} conversionrecursive(num,r,re)=1 & num<r & \\ conversionrecursive(num,r,re)& num>=r & \end{matrix}\right. f(num,r,re)={conversionrecursive(num,r,re)=1conversionrecursive(num,r,re)num<rnum>=r
题目二
f ( n u m , r e s u l t ) = { c o n v e r ( n u m , r e s u l t ) = 1 n u m < 2 c o n v e r ( n u m , r e s u l t ) + c o n v e r ( i n d e x , r e s u l t ) + c o n v e r ( r e m a i n d e r , r e s u l t ) n u m > = 2 f(num,result)=\left\{\begin{matrix} conver(num,result)=1 & num<2 & \\ conver(num,result)+conver(index,result)+conver(remainder,result)& num>=2 & \end{matrix}\right. f(num,result)={conver(num,result)=1conver(num,result)+conver(index,result)+conver(remainder,result)num<2num>=2
源码展示:
题目一:
#include
#include using namespace std;class Conversion {
private:int num; //所要转换的数int r; //目标进制vector <int> re;//转换过程
public:Conversion() {//构造函数初始化num 、rcout << "请输入转换的数与目标进制:";cin >> num >> r;while (num < 0 && r < 2 && r>16) {//判断num与r是否符合要求cout << "输入错误,请重新输入:";cin >> num >> r;}}/*非递归进制转换*/void conversion_common() { if (num > 0 && r != 0) {while (num >= r) {//当num大于r时进行转化re.push_back(num % r);//放入余数num = num / r;//放入商}}else if (num != 0 && r != 0)//当num为负数时的转换while (-num >= r) {re.push_back(-num % r);num = num / r;}re.push_back(num);}/*输出显示函数*/void show(){int a = re.size() - 1;for (; a >= 0; a--) {//if (re[a] == 0)// continue;if (re[a] == 10)//将10以上的数字转换成相应的字母输出cout << "A";else if (re[a] == 11)cout << "B";else if (re[a] == 12)cout << "C";else if (re[a] == 13)cout << "D";else if (re[a] == 14)cout << "E";else if (re[a] == 15)cout << "F";elsecout << re[a];}cout << endl;}/*递归进制转换*/void conversion_recursive() {if (num > 0 && num >= r) {re.push_back(num % r);num = num / r;conversion_recursive();//进行递归}else if( num < 0 && - num >= r){//num小于0的转换re.push_back(-num % r);num = num / r;conversion_recursive();//进行递归}elsere.push_back(num);return;}
};
int main() {cout << "非递归:" << endl;Conversion c1; //进行非递归转换的对象c1.conversion_common();c1.show(); //显示输出cout <<endl<< "递归:" << endl;Conversion c2; //递归转换的对象c2.conversion_recursive();c2.show(); //显示输出system("pause");return 0;
}
题目二:
#include
#include
using namespace std;
class Two_power {
private:string result; //存放结果表达式
public:int num; //输入的数Two_power() {cout << "Input Format:"<<endl;cin >> num;while (num <0 && (num - (int)num) != 0) { //判断输入是否正确cout << "输入错误,请重新输入:";cin >> num;}}/*递归函数*/void conver(int num) {int index = 0, remainder = 0, temp = 2;char a = '(';result += "2(";//初始放入if (num < 2) {if (num == 1)result += "0)";//将1转化为2(0)return;}else{for (; temp <= num; temp = temp * 2)//循环累加得出2的最大次幂index++;if (index == 1) {//判断指数是否为1result.erase(result.end() - 1);//为1则去掉“(”}else if (index == 2) {//判断指数是否为2result += "2";//为2直接放入并且之后加上“)”result += ")";} else {//两者不满足则递归指数conver(index);result += ")";//最后放入“)”}remainder = num - temp / 2;//计算余数if (remainder > 0) {//判断余数是否大于0result += "+";//大于则+if (remainder == 2)//余数为2,直接放入result += "2";elseconver(remainder);//不为2 则递归余数}}}/*显示输出函数*/void show() {cout << "Output Format:" <<endl<< result << endl;}
};
int main() {Two_power t1;//定义对象t1.conver(t1.num);//调用转化方法t1.show();//显示输出system("pause");
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
