题目:点此

题意描述:

任何一个正整数都可以用2的幂次方表示。例如:

    137=27+23+20

同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

    2(7)+2(3)+2(0)

进一步:7=22+2+20(21用2表示)

        3=2+20

所以最后137可表示为:

    2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

    1315=210+28+25+2+1

所以1315最后可表示为:

    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

 

 

 

思路:

使用递归,如果要输出的是2,直接输出2;如果是1,输出2(0)。

计算log2n(我的up_pow函数),并存储。

先输出一个2,如果i也就是㏒2n不是一,输出左括号“(”,递归调用i,再输出右括号“)”。

如果还有剩余(n-2i!=0)输出+,递归调用,然后结束函数。

再main函数中,只需读入n,然后调用函数即可。

 

 

犯的错误:

  1. 快速幂没加返回值。
  2. 有很多地方应是i不是i-1。
  3. 快速幂函数没加边界条件。

 

收获:

  1. 要仔细,不要漏东西。

 

代码:

#include <iostream>
using namespace std;
int quick_pow(int index,int r){
	if(r==0){
		return 1;
	}
	if(r==1){
		return index;
	}
	int data=1;
	if(r%2!=0){
		data=index;
	}
	int type=quick_pow(index,r/2);
	data*=type*type;
	return data;
}
int up_pow(int max){
	int index=1,number=0;
	while(index<max){
		number++;
		index<<=1;
	}
	if(index>max){
		number--;
	}
	return number;
}
int f(int n){
	if(n==1){
		cout << "2(0)";
		return 0;
	}
	if(n==2){
		cout << "2";
		return 0;
	}
	int i=up_pow(n);
	cout << "2";
	if(i!=1){
		cout << "(";
		f(i);
		cout << ")";
	}
	n-=quick_pow(2,i);
	if(n!=0){
		cout << "+";
		f(n);
	}
	return 0;
}
int main(){
	int n;
	cin >> n;
	f(n);
	return 0;
}

  

posted on 2020-02-07 10:02  eason66  阅读(272)  评论(0编辑  收藏  举报